C 小y的旅行
先把两个都是的边用并查集连起来,再把含有的边进行判断,如果这俩本身连起来了,那么这俩就得拆开,。如果没有连起来,就让他们连起来。
#include<bits/stdc++.h> using namespace std; const int N=2e6+10; int n,m,k,ans; int fa[N],a[N],b[N]; inline void finit () { for(int i=1;i<=n;i++) fa[i]=i; } inline int find(int x) { if(fa[x] == x) return x; return fa[x] = find(fa[x]); } inline void join(int a,int b) { int a1=find(a),b1=find(b); if(a1!=b1) fa[a1]=b1; } int main() { cin>>n>>m>>k; finit(); for(int i=1;i<=m;i++){ cin>>a[i]>>b[i]; if(a[i]>k && b[i]>k) join(a[i],b[i]); } for(int i=1;i<=m;i++){ if(a[i]<=k || b[i]<=k){ int u=find(a[i]); int v=find(b[i]); if (u==v) ans++; fa[u]=v; } } cout<<ans<<endl; return 0; }