CodeForces 1250N Wires ###K ###K //K
题目链接:https://codeforces.ml/problemset/problem/1250/N
题意:给定很多条边,问如何删除一条边在加上一条边使得所有的边连通
思路:在n个连通块中 每次dfs找到每个连通块的最后一个点,就不要这个点 把这条边连在其他连通块上即可
虽然有环 但当成树的话其实就是找叶子节点 数据范围需要离散化一下
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=2e5+10; 4 const int mod=1e9+7; 5 #define ll long long 6 #define pi pair<int,int> 7 #define fi first 8 #define sc second 9 #define pb push_back 10 pi a[maxn]; 11 int v[maxn]; 12 map<int,int>mp; 13 int tot; 14 vector<pi>E[maxn]; 15 int cnt; 16 pi b[maxn]; 17 int vis[maxn]; 18 19 20 21 22 int id(int x) 23 { 24 if(!mp[x])mp[x]=++tot,v[tot]=x; 25 return mp[x]; 26 27 } 28 29 void dfs(int u,int fa) 30 { 31 vis[u]=1; 32 for(auto &v:E[u]) 33 { 34 if(vis[v.fi]) continue; 35 b[cnt]={v.fi,v.sc}; 36 dfs(v.fi,u); 37 } 38 } 39 40 41 int main() 42 { 43 ios::sync_with_stdio(0); 44 cin.tie(0); 45 int t; 46 cin>>t; 47 while(t--) 48 { 49 tot=cnt=0; 50 mp.clear(); 51 int n; 52 cin>>n; 53 for(int i=1;i<=2*n;i++) E[i].clear(),vis[i]=0; 54 55 for(int i=1;i<=n;i++) 56 { 57 int x,y; 58 cin>>x>>y; 59 x=id(x),y=id(y); 60 a[i]={x,y}; 61 E[x].pb({y,i}); 62 E[y].pb({x,i}); 63 } 64 65 for(int i=1;i<=tot;i++) 66 { 67 if(vis[i]) continue; 68 ++cnt; 69 dfs(i,0); 70 } 71 cout<<cnt-1<<'\n'; 72 int u=b[1].fi; 73 u=v[u]; 74 for(int i=2;i<=cnt;i++) 75 { 76 cout<<b[i].sc<<" "<<v[b[i].fi]<<" "<<u<<'\n'; 77 } 78 79 } 80 }

浙公网安备 33010602011771号