水题不多说。上代码
/*这题主要是因为文件数一定是1到n,不具有普遍性 不过成环判定确实巧妙,先将输入按数组存好, 之后在查找的时候交换行列,将列变为未知量一个个查找 若数字未被使用过则标记为1(使用过) 之后将找到的数字作为前面的数传入寻找与它相连的数,若找到了但被用过了即代表循环了 就变成了寻找是否有数字相连且是否被标记过(循环) vis数组代表的是有没有数组与它相连过*/ #include<stdio.h> #include<string.h> #define M 107 int g[M][M],vis[M],flag,n; void dfs(int u) { for(int i=1;i<=n;i++) { if(!flag) return; else if(vis[i]&&g[u][i]) { flag=0; return; } else if(g[u][i]) { vis[i]=1; dfs(i); vis[i]=0; } } } int main() { while(~scanf("%d",&n)&& n!=-1) { memset(vis,0,sizeof(vis)); memset(g,0,sizeof(g)); int u,v; flag=1; for(int i=1;i<=n;i++) { scanf("%d%d",&u,&v); if(u!=v)//如果不加,会WA,已验证 g[u][v]=1; } int in; scanf("%d",&in); vis[in]=1; dfs(in); if(flag) printf("Yes "); else printf("No "); } return 0; }