|
沙发
楼主 |
发表于 2018-10-4 17:24:39
|
只看该作者
- #include<iostream>
- #define FOR(i,a,b) for(int i=a;i<=b;i++)
- #define ROF(i,a,b) for(int i=a;i>=b;i--)
- using namespace std;
- const int M=100005,N=10005;
- int f[N],n,m,t[N],h[N],ans;
- bool vis[N];
- int getf(int q)
- {
- if(f[q]==q)return q;
- f[q]=getf(f[q]);
- return f[q];
- }
- void merge(int x,int y)
- {
- int t1=getf(x),t2=getf(y);
- if(t1!=t2)
- {
- f[t1]=t2;
- t[t2]+=t[t1];
- }
- }
- int main()
- {
- cin>>n>>m;
- FOR(i,1,n){f[i]=i;t[i]=1;}
- FOR(i,1,m)
- {
- int a,b;
- cin>>a>>b;
- int x=getf(a),y=getf(b);
- if(x!=y)
- {
- if(h[a]) merge(h[a],y);
- if(h[b]) merge(h[b],x);
- h[a]=y;
- h[b]=x;
- }
- else{cout<<"Impossible"<<endl;return 0;}
- }
- FOR(i,1,n)
- {
- int q=getf(i);
- if(!vis[q])
- {
- int q1=getf(h[i]);
- vis[q]=1;
- vis[q1]=1;
- ans+=min(t[q],t[q1]);
- }
- }
- cout<<ans<<endl;
- return 0;
- }
复制代码 |
|