1 条题解
-
0
C++ :
#include <iostream> #include <cstdio> #include <algorithm> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int N = 200001; struct edge{ int to, pre; }e[N]; int l = 0, u[N], sz[N]; void ins(int a, int b){ e[++l] = (edge){b, u[a]}, u[a] = l; } #define reg(i,a) for(int i=u[a];i;i=e[i].pre) #define v e[i].to int f[N]; int find(int x){ return f[x] == x ? x : f[x] = find(f[x]); } int list[N], L = 0; void init(){ l = 0; rep(i,0, L - 1) { int x = list[i]; f[x] = x, u[x] = 0, sz[x] = 1; } L = 0; } int ans1[N], T = 0; int main(){ int tp, a, b, ans = 0, flag = 0; rep(i,1,N - 1) sz[i] = 1, f[i] = i; while (scanf("%d%d%d", &a, &b, &tp) == 3) { list[L++] = a, list[L++] = b; if (tp == 1){ a = find(a), b = find(b); if (a == b) {ans++;continue;} if (sz[a] > sz[b]) swap(a,b); int j = 0; reg(i,a) if ((v = find(v)) == b) {flag = 1; break;} else j = i; if (!flag){ f[a] = b; if (u[a]){ e[j].pre = u[b]; u[b] = u[a]; } sz[b] += sz[a]; } }else{ a = find(a), b = find(b); if (a != b) ins(a, b), ins(b, a); else flag = 1; } if (flag) flag = 0, ans++, ans1[++T] = ans, ans = 0, init(); else ans++; } printf("%d\n",T); rep(i,1,T) printf("%d\n",ans1[i]); return 0; }
- 1
信息
- ID
- 1571
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者