1776 Task Sequences 竞赛图构造哈密顿路径

来源:互联网 发布:淘宝网水晶家纺被子 编辑:程序博客网 时间:2024/06/10 15:18

时空隧道


题目大意:
给出一张有向完全图(也就是竞赛图),要求求出一条哈密顿路径。


分析:
假设我们当前已经构造出了前n个点的哈密顿路径,存在ans数组中,我们接下来要向这条路径中加入第n+1个点,那么合法的加入分为三种情况:
第一种情况:
这里写图片描述
(简单易懂,不再赘述)
第二种情况:
这里写图片描述
(同样简单易懂,加到最后即可)
第三种情况:
这里写图片描述
(一定存在至少一条边指向第n+1个点,这样的话,只要把第n+1个点加在这个指向它的点的后面就好啦)


代码如下:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>//by NeighThorn using namespace std;const int maxn=1000+5;int n,mp[maxn][maxn],ans[maxn];inline int read(void){    char ch=getchar();int f=1,x=0;    while(!(ch>='0'&&ch<='9')){        if(ch=='-')f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')        x=x*10+ch-'0',ch=getchar();    return f*x; }signed main(void){    while(scanf("%d",&n)!=EOF){        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                mp[i][j]=read();            for(int i=1;i<=n;i++){            int tmp=1;            for(int j=i-1;j>=1;j--){                if(j==1&&mp[i][ans[1]]==1){                    tmp=1;                    break;                }                else if(j==i-1&&mp[ans[j]][i]==1){                    tmp=i;                    break;                }                else                    if(mp[ans[j]][i]==1){                        tmp=j+1;                        break;                    }            }            for(int j=i;j>tmp;j--)                ans[j]=ans[j-1];             ans[tmp]=i;        }        printf("1\n%d\n",n);        for(int i=1;i<=n;i++)            printf("%d ",ans[i]);        puts("");    }    return 0;   }

by >_< NeighThorn

1 0
原创粉丝点击