并查集
想法很简单
开两个数组
吃 与 被吃
然而 炸了我一下午
mlgb
贴个错误代码
吃饭去了
烦
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=55555; int fa[maxn]; int eat[maxn]; int ate[maxn]; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } void merge(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) fa[fy]=fx; } int main() { int n,k; int com,n1,n2; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { eat[i]=0; ate[i]=0; fa[i]=i; } int num=0; for(int i=0;i<k;i++) { scanf("%d%d%d",&com,&n1,&n2); if(com==1) { if(n1>n||n2>n) {num++;continue;} if(find(n1)==find(eat[n2])||find(n2)==find(eat[n1])) {num++;continue;} if(!(eat[n1]==0&&ate[n2]==0)) { if(find(eat[n1])==find(ate[n2])) {num++;continue;} } // if(find(n2)==find(ate[n1])||find(n1)==find(ate[n2])) // {num++;continue;} merge(n1,n2); } else if(com==2) { if(n1>n||n2>n) {num++;continue;} // else // { if(n1==n2) {num++;continue;} if(find(n1)==find(n2)) {num++;continue;} // if(find(ate[n1])==find(n2)) // {num++;continue;} if(find(n1)==find(eat[n2])) {num++;continue;} if(!(eat[n1]==0&&ate[n2]==0)) { if(find(eat[n1])==find(ate[n2])) {num++;continue;} } if(!(eat[n1]==0&&eat[n2]==0)) //if(eat[n1]==find(eat[n2])||eat[n2]==find(eat[n1])) { if(find(eat[n1])==find(eat[n2])) {num++;continue;} } if(eat[n1]==0) eat[n1]=n2; else merge(eat[n1],n2); if(ate[n2]==0) ate[n2]=n1; else merge(ate[n2],n1); // } } } printf("%d\n",num); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-05 12:26:05