小希的迷宫
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30274 Accepted Submission(s): 9394
Problem Description
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。


Input
输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。
整个文件以两个-1结尾。
Output
对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0
8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0
3 8 6 8 6 4 5 3 5 6 5 2 0 0
-1 -1
Sample Output
Yes
Yes
No
Author
Gardon
Source
并查集判断连通性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include<cstdio> #include<set> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int p[100005]; int find( int x) { return p[x]==x?x:p[x]=find(p[x]); } void solve() { int u,v; while (1){ set< int >s; int cnt=0,leap=0; for ( int i=0;i<=100000;++i) p[i]=i; while ( scanf ( "%d%d" ,&u,&v)) { if (!u&&!v) break ; if (u==-1&&v==-1) return ; cnt++; if (u==v) continue ; s.insert(u);s.insert(v); int x=find(u); int y=find(v); if (x==y) leap=1; else p[y]=x; } int cnt2=0; if (!cnt) {cout<< "Yes" <<endl; continue ;} for ( int i=1;i<=100000;++i) if (p[i]!=i) cnt2++; if (leap) cout<< "No" <<endl; else if (s.size()-cnt2>1) cout<< "No" <<endl; else cout<< "Yes" <<endl; } } int main() { std::ios::sync_with_stdio(0); solve(); } |
bfs判断连通性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include<cstdio> #include<vector> #include<queue> #include<set> #include<utility> #include<iostream> #include<cstring> #include<algorithm> #define MAXN 100000 using namespace std; vector< int >G[MAXN]; set< int >s; int vis[100000]; int g; int ecnt; void in_sert( int u, int v) { s.insert(u); s.insert(v); G[u].push_back(v); G[v].push_back(u); } int readg() { for ( int i = 0 ;i < MAXN; i++) G[i].clear(); s.clear(); int u,v; cin>>u>>v; if (u==-1&&v==-1) return -1; if (!u&&!v) {cout<< "Yes" <<endl; return 0;} g=u; in_sert(u,v); ecnt=1; while (cin>>u>>v) { if (!u&&!v) break ; ecnt++; in_sert(u,v); } return 1; } void bfs( int st) { memset (vis,0, sizeof (vis)); int now; queue< int >que; vis[st]=1; que.push(st); while (!que.empty()) { now=que.front(); que.pop(); for ( int i=0; i<G[now].size(); ++i) { if (!vis[G[now][i]]) { que.push(G[now][i]); vis[G[now][i]]=1; } } } } int main() { //freopen("case.txt","r",stdin); std::ios::sync_with_stdio(0); while (1){ int t=readg(); if (t==-1) break ; if (!t) continue ; bfs(G[g][0]); int cnt=0; for ( int i=0; i<100000; ++i) if (!vis[i]) cnt++; if (MAXN-cnt==s.size()&&ecnt==s.size()-1) cout<< "Yes" <<endl; else cout<< "No" <<endl; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧