zoj 3332 竞赛图哈密顿路

题意:给定一个有向竞赛图,求这个图的一个哈密顿路,如果不存在,输出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;
}


你可能感兴趣的:(zoj 3332 竞赛图哈密顿路)