2 条题解
-
0
#include <bits/stdc++.h> using namespace std; int f[110000], cntodd[110000], cntsum[110000], rd[110000]; int findfa(int x){ return f[x]=(f[x]==x?f[x]:findfa(f[x]));} int main() { int n, m; while(scanf("%d%d", &n, &m)!=EOF) { memset(rd, 0, sizeof(rd)); for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=m;i++) { int x, y;scanf("%d%d", &x, &y);rd[x]++, rd[y]++; f[findfa(x)]=findfa(y); } memset(cntodd, 0, sizeof(cntodd)); memset(cntsum, 0, sizeof(cntsum)); for(int i=1;i<=n;i++) { cntsum[findfa(i)]++; if(rd[i] & 1)cntodd[findfa(i)]++; } int ans=0; for(int i = 1; i <= n; i++)if(f[i]==i) { if(cntsum[i]==1) continue; if(cntodd[i]==0) ans++; else ans+=cntodd[i] / 2; } printf("%d\n", ans); } return 0; } -
0
#include <bits/stdc++.h> using namespace std; int f[110000],cntodd[110000],cntsum[110000],rd[110000]; int findfa(int x){ return f[x]=(f[x]==x?f[x]:findfa(f[x]));} int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(rd,0,sizeof(rd)); for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=m;i++) { int x,y;scanf("%d%d",&x,&y);rd[x]++,rd[y]++; f[findfa(x)]=findfa(y); } memset(cntodd,0,sizeof(cntodd)); memset(cntsum,0,sizeof(cntsum)); for(int i=1;i<=n;i++) { cntsum[findfa(i)]++; if(rd[i] & 1)cntodd[findfa(i)]++; } int ans=0; for(int i = 1; i <= n; i++)if(f[i]==i) { if(cntsum[i]==1) continue; if(cntodd[i]==0) ans++; else ans+=cntodd[i] / 2; } printf("%d\n",ans); } return 0; }
- 1
信息
- ID
- 1863
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 3
- 上传者