标签:poj
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 43526 | Accepted: 12679 |
Description
Input
Output
Sample Input
100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5
Sample Output
3
看了之后对并查集的了解更加深了。。。
弱菜在此感谢博主。。
还有这道题我用多重输入就错了。。
害我弄了好久。。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<sstream> #include<cmath> using namespace std; #define M 100500 int n; int k; int d; int x; int y; int p[M]; int r[M]; int ans; void start() { for(int i=1; i<=n; i++) { p[i]=i; //初始化并查集 r[i]=0; //初始化时,每个元素作为一个集合,其元素为1 } } int find(int x) //并查集的find { if( p[x]==x ) return x; else { int t = p[x]; p[x] = find ( p[x] ); r[x] = (r[x]+r[t])%3; return p[x]; } } void Kruskal(int x, int y, int d) { int xx = find(x); int yy = find(y); p[yy] = xx; r[yy] = (r[x]-r[y]+3+(d-1))%3; } int main() { scanf("%d%d", &n, &k); start(); ans = 0; for(int i=1; i<=k; i++) { scanf("%d%d%d", &d, &x, &y); if(x>n || y>n || (d==2&&x==y)) ans++; else if( find(x) == find(y) ) { if( d==1 && r[x]!=r[y] ) ans++; if( d==2 && (r[x]+1)%3 != r[y] ) ans++; } else Kruskal(x, y, d); } printf("%d\n", ans); return 0; }
POJ 1182 :食物链(并查集),布布扣,bubuko.com
标签:poj
原文地址:http://blog.csdn.net/u013487051/article/details/37822619