2015-04-22 11 views
5

Tôi đang cố gắng tìm ra số lượng nút được bao phủ tối đa qua một đường dẫn trong một biểu đồ nhất định. Tôi đã thực hiện một chương trình bằng cách sử dụng đệ quy nhưng nó là đưa ra câu trả lời chỉ cho một số đồ thị đơn giản không phải trên đồ thị phức tạp.Làm cách nào để bao gồm số lượng nút tối đa qua đường dẫn nhất định trong biểu đồ?

Đầu vào được đưa ra trong một mảng chuỗi như 1 # 2: có nghĩa là nút 1 được kết nối với nút 2 hoặc ngược lại.

Tôi đã tạo một ma trận có tổng kích thước nút và nếu nút được kết nối được đặt 1 khác -1 trong ma trận. Ma trận này được sử dụng để tính toán nút được bao phủ tối đa trong đường dẫn.

Code:

import java.io.*; 
import java.util.*; 

public class Medium 
{ 
public static int node_covered; 
public static int big=0; 
public static boolean[] visited; 
public static int matrix_length; 
public static String[][] matrix; 

public static String[] input=new String[] 
//answer is 7. 
{"1#2", "2#3","3#4","3#5","5#6","5#7","6#7","7#8"}; 

public static void main(String[] args){ 
     int total_nodes=maxno_city(input); 
     System.out.println(total_nodes); 
    } 

public static int maxno_city(String[] input1) 
{ 
int ln=input1.length; 
HashSet hs = new HashSet(); 

for(int i=0; i<ln;i++) 
{ 
    String[] temp=input1[i].split("#");  
    hs.add(temp[0]);   
    hs.add(temp[1]);  
} 

matrix_length=hs.size(); 
hs.clear(); 
matrix=new String[matrix_length][matrix_length]; 
//initialize matrix 
for (String[] row : matrix) 
    Arrays.fill(row, "-1"); 

//System.out.println(Arrays.deepToString(matrix)); 

for(int i=0;i<matrix_length;i++) 
{ 
    for(int j=0; j<matrix_length;j++) 
    { 
     String[] temp=input1[i].split("#"); 
     int first=Integer.parseInt(temp[0])-1; 
     int second=Integer.parseInt(temp[1])-1; 
     matrix[first][second]="1"; 
     matrix[second][first]="1"; 
    } 
} 
//System.out.println(Arrays.deepToString(matrix)); 
//initialized 
//now start work on matrix 
for(int i=0;i<matrix_length;i++) 
{ 
    for(int j=0; j<matrix_length;j++) 
    { 
     visited=new boolean[matrix_length]; 
     if(matrix[i][j].equals("1")) 
     { 
      node_covered=0; 
      getNextPath(j,i); 
      //visited[i]=true; 
     } 
    } 
} 
    return big; 
} 

//recursive method 
public static void getNextPath(int path,int visited_node) 
{ 
    boolean flag=false; 
    visited[visited_node]=true; 
    node_covered++; 
    for(int i=0;i<matrix_length;i++) 
    { 
     if(matrix[path][i].equals("1") && visited[i]==false) 
     { 
      //visited[i]=true; 
      flag=true; 
      getNextPath(i,path); 
      //visited[i]=false; 
     } 
    } 
    if(flag==false) 
    { 
     if(big<node_covered) 
     { 
      big=node_covered; 
      //System.out.println(big); 
     } 
    } 
    else 
    { 
     node_covered--; 
    } 
    //visited[path]=false; 
} 
} 

Nơi tôi đang làm sai lầm trong mã trên?

+0

điều này có thể được hoàn tất, không chắc chắn phải kiểm tra –

+0

Nó có giải pháp ... Tôi đang bỏ qua điều gì đó. Đó là lý do tôi hỏi ở đây. –

+0

Sẽ tốt hơn nếu bạn chỉ ra nguồn sự cố để chúng tôi cũng có một số trường hợp thử nghiệm. –

Trả lời

2

Vấn đề chính của bạn là bạn không lưu trữ ma trận hoàn chỉnh. Vòng lặp này:

for(int i=0;i<matrix_length;i++) 
{ 
    for(int j=0; j<matrix_length;j++) 
    { 
     String[] temp=input1[i].split("#"); 
     int first=Integer.parseInt(temp[0])-1; 
     int second=Integer.parseInt(temp[1])-1; 
     matrix[first][second]="1"; 
     matrix[second][first]="1"; 
    } 
} 

không lặp một cách chính xác hơn input1 để cư matrix. Do đó, các đầu vào cuối cùng bị bỏ qua (bạn cũng có thể thấy rằng j không được sử dụng ở tất cả trong vòng lặp bên trong). Bạn do đó nên thay đổi nó thành một sự lặp lại chính xác:

for (int i = 0; i < input1.length; i++) 
{ 
    String[] temp = input1[i].split("#"); 
    int first = Integer.parseInt(temp[0]) - 1; 
    int second = Integer.parseInt(temp[1]) - 1; 
    matrix[first][second] = "1"; 
    matrix[second][first] = "1"; 
} 

(Bạn cũng có thể muốn cải thiện nó hơn nữa để một foreach loop vì bạn không cần giá trị của i)

tôi phát hiện này bằng cách gỡ lỗi mã của bạn và tìm ra rằng nó không recurse vào một số nút, và sau đó tôi figured rằng matrix là không đầy đủ. Bạn nên in matrix để kiểm tra xem nó có chính xác hay không.

Một số vấn đề khác:

  • Bạn phải thiết lập lại mảng visited của bạn khi backtracking, nếu không bạn sẽ không đánh giá 2 con đường khác nhau mà đi qua cùng một nút (bỏ ghi chú visited[path]=false;)
  • Bạn không cần flag: trong cả hai trường hợp, bạn nên kiểm tra xem bạn có "điểm cao" mới hay không và giảm node_covered trước khi rời khỏi vòng lặp
  • Mã của bạn sẽ không thành công nếu có thành phố không được kết nối với phần còn lại của biểu đồ, vì Set hs của bạn sẽ quá nhỏ. Cố gắng tìm nút có số cao nhất thay thế.

Một số cải tiến có thể:

  • Chuyển đổi matrix để một ma trận boolean. Điều này cũng sẽ loại bỏ sự cần thiết phải khởi tạo nó.
  • Bạn không cần 2 thông số cho getNextPath(). Hãy thử làm mọi thứ bạn cần với visited_node tại địa điểm gọi điện. Sau đó bạn sẽ có thể đơn giản hóa nó hơn nữa.
  • Nếu bạn quản lý để giảm nó thành 1 tham số, bạn sẽ không cần 2 vòng lặp for lồng nhau để bắt đầu đệ quy.
+0

Cảm ơn đã cho tôi thông tin có giá trị và tôi đang cố sửa mã khi bạn chia sẻ thông tin tại đây. Thông tin rất hữu ích. –

+0

Bạn thật tuyệt vời !!! Xong và làm việc cho tất cả các đồ thị được kết nối và không được kết nối. –

Các vấn đề liên quan