hdu1232:http://acm.hdu.edu.cn/showproblem.php?pid=1232
代码:
#include<bits/stdc++.h>
#define MAXN 100005
int f[MAXN];
void init()
{
for(int i=0;i<MAXN;i++)
f[i]=i;
}
int get(int x)
{
if(x!=f[x])
f[x]=get(f[x]);
return f[x];
}
void unite(int x,int y)
{
f[get(x)]=get(y);
}
int main()
{
int n,m;
while(scanf("%d",&n),n)
{
init();
scanf("%d",&m);
int a,b;
while(m--)
{
scanf("%d%d",&a,&b);
unite(a,b);
}
int res=0;
for(int i=1;i<=n;i++)
{
if(f[i]==i)
res++;
}
printf("%d\n",res-1);///n个点需要n-1条路
}
return 0;
}
CodeForces - 977E:https://vjudge.net/problem/CodeForces-977E
题意:
给你一个图,问你有几个没有杂边的单环(度全为2)
解析:
度为1的点不用管,连续边,判断是否连通,如果连通,ans++,否则连接这个边
ac:
#include<bits/stdc++.h>
#define MAXN 400005
using namespace std;
int f[MAXN];
int in[MAXN];
int ans=0;
void init()
{
for(int i=0;i<MAXN;i++)
f[i]=i;
memset(in,0,sizeof(in));
ans=0;
}
int get(int x)
{
if(x!=f[x])
f[x]=get(f[x]);
return f[x];
}
void unite(int x,int y)
{
x=get(x),y=get(y);
if(x==y)
ans++;
f[x]=y;
}
int a[MAXN],b[MAXN];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a[i],&b[i]);
in[a[i]]++;
in[b[i]]++;
}
for(int i=1;i<=m;i++)
{
if(in[a[i]]==2&&in[b[i]]==2)
unite(a[i],b[i]);
}
printf("%d\n",ans);
}
return 0;
}
hdu1272:https://vjudge.net/problem/HDU-1272
题意:判断是否连通且无环
代码:
#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
int vis[MAXN];
int f[MAXN],sign;
int n,m,k,maxs;
void init()
{
maxs=sign=k=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<MAXN;i++)
f[i]=i;
}
int get(int x)
{
if(x!=f[x])
f[x]=get(f[x]);
return f[x];
}
void unite(int x,int y)
{
x=get(x),y=get(y);
if(x==y)
sign=1;
f[x]=y;
}
int main()
{
init();
while(scanf("%d%d",&n,&m)&&n!=-1||m!=-1)
{
if(n==0&&m==0)
{
for(int i=1;i<=maxs;i++)
{
if(vis[i]==0)
continue;
if(f[i]==i)//存在一个独立的集合
k++;
}
if(k>1)
sign=1;
if(!sign)
printf("Yes\n");
else
print