标签:
题意:n个点n*(n-1)/2条有向边,求每个点遍历一次的顺序,否则输出Impossible。
思路:简单dfs遍历。以每个点为起点遍历,直到找出解;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m,temp,flag; int num[5050],vis[5050]; int mm[505][505]; void dfs(int v){ num[temp++]=v; if(temp==n){ flag=1;return; } for(int i=1;i<=n;i++){ if(mm[v][i]==1&&!vis[i]){ vis[i]=1; dfs(i); if(flag==1) return; temp--; //不能忘 vis[i]=0; } } } int main(){ int i,j,k,u,v; while(scanf("%d",&t)!=EOF){ while(t--){ scanf("%d",&n); m=n*(n-1)/2; memset(vis,0,sizeof(vis)); memset(mm,0,sizeof(mm)); for(i=0;i<m;i++){ scanf("%d%d",&u,&v); mm[u][v]=1; } flag=0; for(i=1;i<=n;i++){ temp=0; vis[i]=1; dfs(i); if(flag) break; vis[i]=0; } if(flag){ for(int i=0;i<n;i++){ if(i<n-1){ printf("%d ",num[i]); } else printf("%d\n",num[i]); } } else printf("Impossible\n"); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/dominating/p/4776569.html