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 }
View Code

 

posted @ 2020-10-12 08:51  canwinfor  阅读(229)  评论(0)    收藏  举报