题意:给定一个有向竞赛图,求这个图的一个哈密顿路,如果不存在,输出Impossible。
思路:有向竞赛图必然存在HP的。证明:考虑极长路径p1,p2...pn;再考虑路径外一点x。如果有(x,p1),那么这条路加长了;否则必有(p1,x),那么如果有(x,p2),那么x可以加到p1,p2之间,路还是加长了;所以只能是(x,p2),如此这般,只能有(pn,x)路还是加长了。。。
做的时候只需要按上述思路,按顺序将点加进去就行了。复杂度是n^2的。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <vector>
using namespace std;
#define clr(s,t) memset(s,t,sizeof(s))
#define N 105
int T,n,res[N],g[N][N];
int main(){
scanf("%d",&T);
while(T--){
int i,j,k,a,b;
clr(g, 0);
scanf("%d",&n);
j = (n-1)*n/2;
for(i = 1;i<=j;i++){
scanf("%d %d",&a,&b);
g[a][b] = 1;
}
res[1] = 1;
for(k = 2;k<=n;k++){
for(i = 1;i<k;i++)//找到k点应该插入到哪
if(g[k][res[i]])
break;
for(j = k;j>i;j--)
res[j] = res[j-1];
res[j] = k;
}
for(i = 1;i<n;i++)
printf("%d ",res[i]);
printf("%d\n",res[n]);
}
return 0;
}