Description
一张图,依次将 m 条边加入,问迹的数量,迹为经过至少一条边的回路,且经过的每条边只经过一次
Input
第一行两个整数
Output
每加一条边就输出当前图中迹的数量
Sample Input
3 4
1 3
2 3
1 2
1 2
Sample Output
0
0
1
3
Solution
假设经过
0
条边也是迹,那么初始状态答案是
考虑关联矩阵
以此异或运算对该矩阵做消元,最后会有
m−r(M)
个
0
行,这些
每次加一条新边的时候,如果这条新边可以被之前的边表出,那么相当于
m
加一,
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100005;
#define mod 1000000009
int fa[maxn];
int find(int x)
{
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)fa[i]=i;
int ans=0;
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
a=find(a),b=find(b);
if(a==b)ans=(ans*2+1)%mod;
else fa[a]=b;
printf("%d\n",ans);
}
}
return 0;
}