CodeForces 1250N Wires

题目链接:https://codeforces.ml/problemset/problem/1250/N

题意:给定很多条边,问如何删除一条边在加上一条边使得所有的边连通
思路:在n个连通块中  每次dfs找到每个连通块的最后一个点,就不要这个点 把这条边连在其他连通块上即可  数据范围需要离散化一下

CodeForces 1250N	Wires
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn =2e5+10;
 6 const int mod=1e9+7;
 7 int num[maxn];
 8 vector<pair<int,int>>E[maxn];
 9 int vis[maxn];
10 
11 
12 int n;
13 int tot;
14 map<int,int>mp;
15 
16 int index=-1;
17 int q[maxn];
18 int w[maxn];
19 void dfs(int x)
20 {
21     vis[x]=1;
22     index=x;
23     for(auto &v:E[x])
24     {
25         if(vis[v.first])
26         continue;
27         dfs(v.first);
28     }
29 }
30 
31 
32 
33 
34 int main()
35 {
36     ios::sync_with_stdio(false);
37     cin.tie(0);
38     int t;
39     cin>>t;
40     while(t--)
41     {
42         cin>>n;
43         tot=0;
44         mp.clear();
45         for(int i=1;i<=n;i++)
46         {
47             int x,y;
48             cin>>x>>y;
49             q[i]=x,w[i]=y;
50             if(!mp[x])
51             {
52                 num[++tot]=x;
53                 mp[x]=tot;
54             }
55             if(!mp[y])
56             {
57                 num[++tot]=y;
58                 mp[y]=tot;
59             }
60             E[mp[x]].pb({mp[y],i});
61             E[mp[y]].pb({mp[x],i});
62         }
63 
64         for(int i=1;i<=tot;i++)
65             E[i].clear();
66         for(int i=1;i<=n;i++)
67         {
68             int x=q[i],y=w[i];
69             E[mp[x]].pb({mp[y],i});
70             E[mp[y]].pb({mp[x],i});
71         }
72 
73         for(int i=1;i<=tot;i++)
74             vis[i]=0;
75         vector<int>temp;
76         for(int i=1;i<=tot;i++)
77         {
78             if(vis[i])
79                 continue;
80             index=-1;
81             dfs(i);
82             temp.pb(index);
83         }
84 
85         cout<<temp.size()-1<<'\n';
86         int k=temp[0];
87         for(int i=1;i<temp.size();i++)
88         {
89             int u=temp[i];
90             int w=E[u][0].second;
91             cout<<w<<" "<<num[u]<<" "<<num[k]<<'\n';
92         }
93 
94     }
95 
96 
97 
98 }
View Code

 

上一篇:谁锁了我的表


下一篇:【UOJ105】[APIO2014] Beads and wires(换根DP)