标签:描述 scanf 根据 void 任务 can lang 压缩 合并
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 75814 | Accepted: 22528 |
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
Source
#include<cstdio> using namespace std; const int MAXN=5*1e4+5; int n,k; int f[3*MAXN]; int find(int x) //压缩路径+找根 { int r=x; while(r!=f[r]) { r = f[r]; } while(x!=f[x]) { int j = f[x]; f[x] = f[r]; x = j; } return r; } int same(int x,int y) { return find(x)==find(y); } void add(int x,int y) { int u=find(x); int v=find(y); if(u!=v) { f[u] = v; } } int main() { scanf("%d %d",&n,&k); int i,d,x,y,num=0; for(i=1;i<=3*n;i++) { f[i] = i; } for(i=0;i<k;i++) { scanf("%d %d %d",&d,&x,&y); if(x>n||y>n) { num++; continue; } if(d==1) { if(same(x,y+n)||same(x,y+2*n))//判断 y 是否已经在其它两个种类里 { num++; continue; } else { add(x,y);add(x+n,y+n);add(x+2*n,y+2*n); } } if(d==2) { if(same(x,y)||same(x,y+2*n))//判断 y 是否和 x 是同物种或者吃 x { num++; continue; } else { add(x,y+n);add(x+n,y+2*n);add(x+2*n,y); } } } printf("%d\n",num); }
标签:描述 scanf 根据 void 任务 can lang 压缩 合并
原文地址:http://www.cnblogs.com/WWkkk/p/7304904.html