NYOJ207 POJ1182 食物链(并查集)

来源:互联网 发布:mysql添加语句怎么写 编辑:程序博客网 时间:2024/06/10 14:08

我的理解:

并查集解决。

我的代码:

#include <iostream>#include <cstdio>#define MAX_N 50005#define MAX_K 100005using namespace std;int N,K;int T[MAX_K],X[MAX_K],Y[MAX_K];int par[MAX_N],rank[MAX_N];void init(int n){for(int i = 0;i<n;i++){par[i] = i;rank[i] = 0;}}int find(int x){if(par[x] == x){return x;}else{return par[x] = find(par[x]);}}void unite(int x,int y){x = find(x);y = find(y);if(x == y) return;if(rank[x] < rank[y]){par[x] = y;}else{par[y] = x;if(rank[x] == rank[y]) rank[x]++;}}bool same(int x,int y){return find(x) == find(y);}void solve(){init(N*3);int ans = 0;for(int i = 0;i<K;i++){int t = T[i];int x = X[i]-1,y = Y[i]-1;if(x<0 || N<=x || y<0 || N<=y){ans++;continue;}if(t == 1){if(same(x,y+N) || same(x,y+2*N)){ans++;}else{unite(x,y);unite(x+N,y+N);unite(x+N*2,y+N*2);}}else{if(same(x,y) || same(x,y+2*N)){ans++;}else{unite(x,y+N);unite(x+N,y+2*N);unite(x+2*N,y);}}}cout<<ans<<endl;}int main(){freopen("D:/OJ/挑战程序设计竞赛/食物链.txt","r",stdin);cin>>N>>K;for(int i = 0;i<K;i++){cin>>T[i]>>X[i]>>Y[i];}solve();}

原创粉丝点击