题目链接:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=2191
题意:题目意思是输入n个点,再输入m条边,边可以重复;
问加上第a,b之间的边的时候有多少个回路。
思路:将所有点建立一个并查集
(1)如果要插入的a,b点在同一个集合,则再插入的边一点使他们构成一个
回路。回路的总数相当于上一个回路的数量的2倍+1(eg:原来的a,b和所有的其他节点构成ans条回路,新建的
(2)a,b和所有节点构成ans条路,且新旧a,b之间新建一条回路。)
如果插入的a,b不在一个集合,就建立a,b之间的联系。
#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 1e9+9
const int maxn = 100010;
int a[maxn],n;
int f(int x)
{
if(x==a[x]) return a[x];
else a[x]=f(a[x]);
return a[x];
}
void Init()
{
for(int i=1;i<=n;i++) a[i]=i;
}
int main(void)
{
int m,i,ans=0,x,y;
cin>>n>>m;
Init();
for(i=1;i<=m;i++)
{
cin>>x>>y;
int t1=f(x),t2=f(y);
if(t1==t2) ans=ans*2+1;
else a[t2]=t1;
cout<<ans<<endl;
}
//for(i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
参考文章:https://blog.youkuaiyun.com/V5ZSQ/article/details/78936622