L - 小希的迷宫——并查集_环
2017-07-22 18:08
155 查看
Think:
1知识点:并查集集合内判断环的存在+并查集判断集合数目
2反思:
1>题目分析基本完备再代码实现,不要急于求成
2>初始思路错误采取新思路应考虑之前思路可以判断的情况当前思路是否可以判断
vjudge题目链接
参考代码1——并查集集合内判断环的存在
参考代码2——题意条件分析
以下为Wrong Answer代码——判断条件不全面
以下为Accepted代码
4000
1知识点:并查集集合内判断环的存在+并查集判断集合数目
2反思:
1>题目分析基本完备再代码实现,不要急于求成
2>初始思路错误采取新思路应考虑之前思路可以判断的情况当前思路是否可以判断
vjudge题目链接
参考代码1——并查集集合内判断环的存在
参考代码2——题意条件分析
以下为Wrong Answer代码——判断条件不全面
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1e5 + 4; int ans, f , vis ; void Init(); int get_f(int x); void Merge(int u, int v); int main(){ int u, v, mav; while(scanf("%d %d", &u, &v) && (u != -1 && v != -1)){ ans = 0; memset(vis, 0, sizeof(vis)); vis[u] = 1, vis[v] = 1; mav = max(u, v); Init(); Merge(u, v); while(scanf("%d %d", &u, &v) && (u != 0 || v != 0)){ Merge(u, v); vis[u] = 1, vis[v] = 1; mav = max(mav, u); mav = max(mav, v); } if(!ans) printf("Yes\n"); else printf("No\n"); } return 0; } void Init(){ for(int i = 1; i <= N; i++) f[i] = i; } void Merge(int u, int v){ int t1 = get_f(u); int t2 = get_f(v); if(t1 == t2) ans++; else { f[t2] = t1; } } int get_f(int x){ if(f[x] == x) return f[x]; else { f[x] = get_f(f[x]); return f[x]; } }
以下为Accepted代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1e5 + 4; int ans, f , vis ; void Init(); int get_f(int x); void Merge(int u, int v); int main(){ int u, v, mav, miv, i, cnt; while(scanf("%d %d", &u, &v) && (u != -1 && v != -1)){ if(u == 0 && v == 0){ printf("Yes\n"); continue; } ans = 0, cnt = 0; memset(vis, 0, sizeof(vis)); vis[u] = 1, vis[v] = 1; mav = max(u, v); miv = min(u, v); Init(); Merge(u, v); while(scanf("%d %d", &u, &v) && (u || v)){ Merge(u, v); vis[u] = 1, vis[v] = 1; mav = max(mav, u); mav = max(mav, v); miv = min(miv, u); miv = min(miv, v); } for(i = miv; i <= mav; i++){ if(vis[i] && f[i] == i) cnt++; } if((!ans) && cnt == 1) printf("Yes\n"); else printf("No\n"); } return 0; } void Init(){ for(int i = 1; i <= N; i++) f[i] = i; } void Merge(int u, int v){ int t1 = get_f(u); int t2 = get_f(v); if(t1 == t2) ans++; else { f[t2] = t1; } } int get_f(int x){ if(f[x] == x) return f[x]; else { f[x] = get_f(f[x]); return f[x]; } }
4000
相关文章推荐
- HDU 1272 小希的迷宫【并查集】
- 用并查集检查连通性~HDU 1272 小希的迷宫(并查集)
- hdu 小希的迷宫(并查集)(连通无环图)
- 并查集 小希的迷宫
- POJ 1272 小希的迷宫【并查集+无向图判断是否有环 PS:和前一篇判断入度是否为1的很像】
- HDU ACM 1272.小希迷宫(并查集)
- HDU1272 小希的迷宫 并查集
- HDU 1272 小希的迷宫(乱搞||并查集)
- hdu 题目1272 小希的迷宫 (并查集)
- HDU 1272小希的迷宫(简单并查集)
- hdu - 小希的迷宫 - 并查集
- HDU-1272 小希的迷宫 (并查集)
- hdu 1272 小希的迷宫 并查集
- 1272 小希的迷宫(并查集)
- HDU1272 小希的迷宫 并查集
- HDU1272小希的迷宫--并查集入门题
- hdu_1272-小希的迷宫(经典并查集)
- HDU-1272-小希的迷宫【并查集】
- HDU 1272 小希的迷宫 并查集 (判断任意2个点是否有且仅有一条路径可以相通)
- HDU 1272: 小希的迷宫(并查集)