标签:
小希的迷宫 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
Sample Input
Sample Output
#pragma comment(linker, "/STACK:102400000,102400000") // maybe爆栈,有两种解决办法,第一种加
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define N 100005 int f[N], use[N]; void init() { memset(use, 0, sizeof(use)); for(int i = 0; i < N; i++) f[i] = i; } int found(int x) { //int k = f[x]; if(f[x] != x) { f[x] = found(f[x]); //r[x] = r[x]+r[k]; } return f[x]; } int main() { int a, b, sum = 0; init(); int flag = 0; while(1) { cin >> a >> b; if(a == -1 || b == -1) break; if(a+b == 0) { sum = 0; for(int i = 0; i < N; i++) if(use[i] && f[i] == i) sum++; if(flag == 0 && sum < 2) // 只准有一棵树,一个根节点 cout << "Yes" << endl; else cout << "No" << endl; init(); flag = 0; } else { use[a] = use[b] = 1; int nx = found(a), ny = found(b); if(nx != ny) f[nx] = ny; else flag = 1; // 如果两个房间已经有联系了,这条路就没有价值,就不满足小希的思想 } } return 0; }
由于某阔爱的小伙伴并查集没过,就用了一种同样阔爱的方法,同样阔爱的我就很当然的copy了一下,分享给同样阔爱的你们
#include<iostream> #include<cstring> using namespace std; #define N 100005 bool vis[N]; int main() { int a, b, k = 0, m = 0; memset(vis, false, sizeof(vis)); while(cin >> a >> b, a != -1 || b != -1) { if(a+b == 0) { for(int i = 0; i < N; i++) { if(vis[i]) m++; // 计算房间出现的数量 } if(m - k == 1 || m == 0) // 如果满足小希的思想话,房间数减去联通的路数一定等于1.因为每一条路都连着两个房间,而且每条路都有价值。如果输入两个0的话,没有房间,还输出Yes cout << "Yes" << endl; else cout << "No" << endl; k = 0; m = 0; memset(vis, false, sizeof(vis)); } else { vis[a] = vis[b] = true; // 出现的房间数置为true k++; // k记录路数 } } return 0; }
// 能不能不要在我快把博客写好的时候firefox崩溃,打击我积极性。。这到底是为什么
标签:
原文地址:http://www.cnblogs.com/Tinamei/p/4677307.html