哈密顿路径 && 竞赛图

 哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回路的图就是哈密顿图.哈密顿图就是从一点出发,经过所有的必须且只能一次,最终回到起点的路径.
 图中有边可以不经过,但不会有边被经过两次.

竞赛图(哈密顿通路):有向完全图
任意两个不同的点之间恰有一条连边
  N(N>=2)阶竞赛图一点存在哈密顿通路.

一:Dirac定理(充分条件)
  设一个无向图中有N个顶点,若所有顶点的度数大于等于N/2,则哈密顿回路一定存在.(N/2指的是⌈N/2⌉,向上取整)
二:基本的必要条件
  设图G=

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int AX = 1e3 + 5 ;
int n,mp[AX][AX],ans[AX];
char s[AX][AX];
int main(){
    scanf("%d",&n);

    for( int i = 1 ; i <= n ; i++ ){
        scanf("%s",s[i]+1);
    }
    for( int i = 1 ; i <= n ; i++ ){
        for( int j = 1 ; j <= n ; j++ ){
            if( s[i][j] == '+' ){
                mp[i][j] = 1;
            }
        }
    }

    for(int i = 1 ; i <= n ; i ++ ){
        int id = 1;
        for( int j = i - 1 ; j >= 1 ; j-- ){
            if( j == 1 && mp[i][ans[1]] == 1 ){
                id = 1 ;
                break;
            }
            if( j == i-1 && mp[ans[j]][i] == 1 ){
                id = i ;
                break;
            }
            if( mp[ans[j]][i] == 1 ){
                id = j + 1 ;
                break;
            }
        }
        for( int j = i ; j > id ; j-- )
            ans[j] = ans[j-1]; 
        ans[id] = i;
    }
    printf("YES\n");
    for(int i = 1 ; i <= n ; i++ )
        printf("%d ",ans[i]-1);
    printf("\n");
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/frankax/article/details/80460145