题意:~
思路:给定一个n个点,n-1条边,问添加少的边使原图变成一个双连通图。因为给定的就是一棵树,所以问题简单了很多。
#include <bits/stdc++.h>
using namespace std;
const int N = 100050;
vector<int> g[N];
vector<int> ans;
bool flag[N];
void dfs(int u, int f)
{
if((int)g[u].size() == 1) ans.push_back(u);
for(auto &i : g[u]) if(i != f) dfs(i, u);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
while(cin >> n)
{
for (int i = 1; i <= n; i++) g[i].clear();
int u, v;
fill(flag, flag + N + 1, false);
for(int i = 0; i < n - 1; i++)
{
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
flag[v] = 1;
}
int r = 0;
for(int i = 1; i <= n; i++)
{
if(!flag[i])
{
r = i;
break;
}
}
ans.clear();
dfs(r, 0);
int sz = (int)ans.size();
cout << (sz + 1) / 2 << endl;
for(int i = 0; i * 2 < sz; ++i) cout << ans[i] << " " << ans[i + sz / 2] << endl;
}
return 0;
}
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/1406 (转载时请注明本文出处及文章链接)


发表评论
快来吐槽一下吧!