1 solutions
-
0
C :
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 10010 int f[maxn]; int vis[maxn]; char G[maxn][maxn]; int n, m; int find(int v){ if(f[v]==v)return v; int F = find(f[v]); f[v] = F; return F; } int main() { while(scanf("%d%d",&n,&m) != EOF){ for(int i = 0;i <= n; i++)f[i] = i; memset(vis,0,sizeof(vis)); memset(G,0,sizeof(G)); for(int i = 0;i < m; i++){ int a, b, c; scanf("%d%d%d",&a,&b,&c); if(!a){ int fb = find(b); int fc = find(c); f[fc] = fb; } if(a){ G[c][b] = G[b][c] = 1; int fb = find(b); int fc = find(c); for(int i = 1;i <= n; i++){ if(G[c][i] && i != b){ int f1 = find(i); f[f1] = fb; } } for(int i = 1;i <= n; i++){ if(G[b][i] && i != c){ int f1 = find(i); f[f1] = fc; } } } } int ans = 0; for(int i = 1;i <= n; i++){ int fa = find(i); vis[fa] = 1; } for(int i = 1;i <= n; i++){ if(vis[i]){ ans++; } } printf("%d\n",ans); } return 0; }
C++ :
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int a[10500]={0},b[10500]={0}; bool flag[10500]; int n,m,sum=0; int find(int x); void zuhe(int x,int y); int main() { memset(flag,0,sizeof(flag)); memset(b,0,sizeof(b)); cin>>n>>m; for(int i=1;i<=n;++i) { a[i]=i; } for(int i=1;i<=m;++i) { int p,x,y; cin>>p>>x>>y; if(p==0) { zuhe(x,y); } else { if(p==1) { if(b[x]==0) { b[x]=y; } else { zuhe(b[x],y); } if(b[y]==0) { b[y]=x; } else { zuhe(b[y],x); } } } } for(int i=1;i<=n;++i) { flag[find(a[i])]=true; } for(int i=1;i<=n;++i) { if(flag[i]==true) sum++; } cout<<sum<<endl; } int find(int x) { if(a[x]!=x) { a[x]=find(a[x]); } return a[x]; } void zuhe(int x,int y) { x=find(x); y=find(y); a[y]=x; }
- 1
Information
- ID
- 582
- Time
- 2000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By