哈密顿图:图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;
}