1. 首页
  2. DFS

UVALive 5920 Kingdom Roadmap

题意:~

思路:给定一个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;
}

 

评分 1.00, 满分 5 星
1
0
看完收藏一下,下次也能找得到
  • 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
  • 文章链接:http://www.carlstedt.cn/archives/1406 (转载时请注明本文出处及文章链接)
上一篇:
:下一篇

发表评论

gravatar

快来吐槽一下吧!

  1. .01 4:06
  2. .02 1:47
  3. .03 3:39
  4. .04 1:40