Source Code
Problem: 1182 | User: Praesidio | |
Memory: 596K | Time: 235MS | |
Language: C++ | Result: Accepted |
- Source Code
//poj 1182 #include <cstdio> #include <algorithm> #include <iostream> using namespace std; int n,m; int father[50010]; int relation[50010]; int find(int x){ if ( father[x] == x ) return x; int t = father[x]; father[x] = find (father[x]); relation[x] = (relation[x] + relation[t])%3; return father[x]; } void Union (int x, int y, int d) { int u = find(x); int v = find(y); father[v] = u; relation[v] = (relation[x] - relation[y] +(d-1)+3)%3; } int main() { int ans=0; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { father[i]=i; relation[i]=0; } for (int i=0;i<m;i++) { int d,x,y; 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 && relation[x]!=relation[y]) ans++; if (d==2 && (relation[x]+1)%3 != relation[y]) ans++; } else Union(x,y,d); } cout<<ans<<endl; return 0; }