dfs 무방향도 섹션

7067 단어 DFS

제목:

  • 는 무방향도의 인접 행렬을 주었는데 이 무방향도는 두 구역으로 나뉘고 서로 다른 구역 간 노드 거리의 최대치를 구했다.

  • 방법:

  • 각 점이 어느 구역에 있는지 dfs로 열거하면 됩니다.
  • 여기서부터 저는 나무의 잎 노드를 일일이 열거한 후에 거리를 계산했습니다. 이렇게 하면 매번 계산은 n2이고 한 번 변화할 때마다 거리를 바꾼 후에 시간은 5배로 줄었습니다. 왜냐하면 이렇게 하면 잎 노드가 고르게 할당되는 계산량이 n이 부족하기 때문입니다.
  • 여기 두 번째 코드, dfs 함수의 매개 변수 목록에sum가 하나 더 있어 거리를 유지한다
  • 리프 노드에 열거하여 계산하는 코드: (1766MS)

    #include <set>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <cstdio>
    #include <map>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #define LL long long int
    using namespace std;
    const int M=29,INF=0x3fffffff;
    int diagram[M][M],n,str[M],ans=-INF;
    
    int cal(void){
        int sum=0;
        for(int i=1;i <= n;i++){
            if(str[i])
                for(int j=1;j <= n;j++){
                    if(!str[j]){
                        sum+=diagram[i][j];
                    }
                }
        }
        return sum;
    }
    
    void dfs(int x){
         if(x > n){
            int x=cal();
            if(x > ans) ans=x;
            return;
         }
         for(int i=0;i < 2;i++){
            str[x]=i;
            dfs(x+1);
            str[x]=!i;
         }
         return;
    }
    
    int main(void){
        while(~scanf("%d",&n)){
            ans=-INF;
            for(int i=1;i <= n;i++){
                for(int j=1;j <= n;j++){
                    scanf("%d",&diagram[i][j]);
                }
            }
            dfs(1);
            printf("%d
    "
    ,ans); } return 0; }

    한 번 변경할 때마다 거리를 변경하는 코드: (297MS)

    #include <set>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <cstdio>
    #include <map>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #define LL long long int
    using namespace std;
    const int M=29,INF=0x3fffffff;
    int diagram[M][M],n,str[M],ans=-INF;
    
    
    
    void dfs(int x, int sum){
         if(x > n){
            if(sum > ans) ans = sum;
            return;
         }
         for(int i=0;i < 2;i++){
            int temp = 0, key = str[x];
            if(str[x] != i) {
                str[x] = i;
                for(int j = 1; j <= n; j++) {
                    if(j != x && str[j] == i) temp -= diagram[j][x];
                    else if(str[j] != i) temp += diagram[j][x];
                }
            }
            dfs(x + 1, sum + temp);
            str[x] = key;
         }
         return;
    }
    
    int main(void){
        while(~scanf("%d",&n)){
            ans=-INF;
            for(int i=1;i <= n;i++){
                for(int j=1;j <= n;j++){
                    scanf("%d",&diagram[i][j]);
                }
            }
            dfs(1, 0);
            printf("%d
    "
    ,ans); } return 0; }

    좋은 웹페이지 즐겨찾기