【codeforces 723F】st-Spanning Tree
【题目链接】:http://codeforces.com/contest/723/problem/F
【题意】 
 
给你一张图; 
让你选择n-1条边; 
使得这张图成为一颗树(生成树); 
同时s的度数不超过ds且t的度数不超过dt
【题解】 
 
先把s和t隔离开; 
考虑其他点形成的若干个联通块; 
因为一开始的图是联通的; 
所以,那些不同的联通块,肯定是通过s或通过t而联通的; 
这样就只要考虑每个联通块和s、t的联通性了; 
对于只能和s或t之中的一个相连的块; 
直接连一条边到s或t就好,然后ds-=1或是dt-=1(取决与它在原图上只和哪一点相连); 
最后处理能和s以及t同时相连的块; 
这时s和t还是未联通的! 
则一开始先找到一个块; 
让s和t变成联通的 
即s->连通块sp->t 
然后ds-=1,dt-=1 
之后, 
根据ds和dt; 
哪一个不为0就把那个联通块连到哪一个点; 
(这种先把要讨论的点隔开的方式值得借鉴) 
 
【Number Of WA】 
 
0 
 
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 2e5+100;
int n, m,s,t,ds,dt,cnt,vis[N],com;
vector <int> G[N],S[N],T[N];
vector <pii> ans;
void dfs(int x)
{
    vis[x] = 1;
    for (int y : G[x])
    {
        if (y == s)
            S[cnt].push_back(x);
        else
            if (y == t)
                T[cnt].push_back(x);
            else
                if (!vis[y])
                {
                    dfs(y);
                    ans.push_back(mp(x, y));
                }
    }
}
int main()
{
    //freopen("F:\\rush.txt", "r", stdin);
    ios::sync_with_stdio(false), cin.tie(0);//scanf,puts,printf not use
    cin >> n >> m;
    rep1(i, 1, m)
    {
        int x, y;
        cin >> x >> y;
        G[x].pb(y), G[y].pb(x);
    }
    cin >> s >> t >> ds >> dt;
    rep1(i, 1, n)
        if (!vis[i] && i != s && i != t)
        {
            cnt++;
            dfs(i);
        }
    rep1(i, 1, cnt)
        if (S[i].empty())
            ans.push_back(mp(T[i][0], t)), dt--;
        else
            if (T[i].empty())
                ans.push_back(mp(S[i][0], s)), ds--;
            else
                com++;
    if (ds <= 0 || dt <= 0 || ds + dt < com + 1)
        return cout << "No" << endl, 0;
    if (!com)
        ans.push_back(mp(s, t));
    else
    {
        int lj = 0;
        rep1(i,1,cnt)
            if (!S[i].empty() && !T[i].empty())
            {
                if (!lj)
                {
                    ds--, dt--;
                    lj = 1;
                    ans.push_back(mp(S[i][0], s));
                    ans.push_back(mp(T[i][0], t));
                }
                else
                {
                    if (ds)
                        ans.push_back(mp(S[i][0], s)),ds--;
                    else
                        ans.push_back(mp(T[i][0], t)),dt--;
                }
            }
    }
    cout << "Yes" << endl;
    rep1(i, 0, n - 2)
        cout << ans[i].first << ' ' << ans[i].second << endl;
    return 0;
}【codeforces 723F】st-Spanning Tree的更多相关文章
- 【19.27%】【codeforces 618D】Hamiltonian Spanning Tree
		time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ... 
- 【27.91%】【codeforces 734E】Anton and Tree
		time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ... 
- 【codeforces 791D】 Bear and Tree Jumps
		[题目链接]:http://codeforces.com/contest/791/problem/D [题意] 你可以从树上的节点一次最多走k条边. (称为跳一次); 树为无权树; 然后问你任意两点之 ... 
- 【HDU 4408】Minimum Spanning Tree(最小生成树计数)
		Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ... 
- 【27.48%】【codeforces 699D】 Fix a Tree
		time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ... 
- 【Codeforces 1086B】Minimum Diameter Tree
		[链接] 我是链接,点我呀:) [题意] 题意 [题解] 统计叶子节点个数m 把每条和叶子节点相邻的边权设置成s/cnt就可以了 这样答案就是2*s/m(直径最后肯定是从一个叶子节点开始,到另外一个叶 ... 
- 【Codeforces 161D】Distance in Tree
		[链接] 我是链接,点我呀:) [题意] 问你一棵树上有多少条长度为k的路径 [题解] 树形dp 设 size[i]表示以节点i为根节点的子树的节点个数 dp[i][k]表示以i为根节点的子树里面距离 ... 
- 【codeforces 698B】 Fix a Tree
		题目链接: http://codeforces.com/problemset/problem/698/B 题解: 还是比较简单的.因为每个节点只有一个父亲,可以直接建反图,保证出现的环中只有一条路径. ... 
- 【CodeForces 699D】Fix a Tree
		dfs找出联通块个数cnt,当形成环时,令指向已访问过节点的节点变成指向-1,即做一个标记.把它作为该联通图的根. 把所有联通的图变成一颗树,如果存在指向自己的点,那么它所在的联通块就是一个树(n-1 ... 
随机推荐
- 先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)c语言
			#include "stdio.h" #include "string.h" #include "malloc.h" #define NUL ... 
- Linux Terminal fortune
			Linux下,我们能够使用apt-get安装fortune,这是一个比較有趣的功能 在输入fortune之后,Terminal会输出一句名言.诗句,或一些有趣的话: 默认情况下.fortune仅仅会显 ... 
- HDU 1198 Farm Irrigation (并查集优化,构图)
			本题和HDU畅通project类似.仅仅只是畅通project给出了数的连通关系, 而此题须要自己推断连通关系,即两个水管能否够连接到一起,也是本题的难点所在. 记录状态.不断combine(),注意 ... 
- js导出table中的EXCEL总结
			导出EXCEL通常是用PHP做,可是项目中,有时候PHP后端project师返回的数据不是我们想要的,作为前端开发project师,把相应的数据编号转换为文字后,展示给用户.可是.需求要把数据同一时候 ... 
- S 禁止F12和右键操作控制台,兼容各浏览器
			document.oncontextmenu = function () { return false; }; document.onkeydown = function () { ... 
- CharsRefIntHashMap并不比HashMap<String, Integer>快
			我模仿lucene的BytesRef写了一个CharsRefIntHashMap,实測效果并不如HashMap<String, Integer>.代码例如以下: package com.d ... 
- 分布式设计《初尝memcached》
			之前听说过高性能的分布式缓存开源工具,但一直没有真正接触过,如今接触的产品中实用到过分布式缓存.所以决定一探到底.memcached是一个优秀的开源的分布式缓存工具.也是眼下比較火热的分布 ... 
- [Javascript] 40个轻量级JavaScript脚本库
			诸如jQuery, MooTools, Prototype, Dojo和YUI等JavaScript脚本库,大家都已经很熟悉.但这些脚本库有利也有弊--比如说JavaScript文件过大的问题.有时你 ... 
- 【正则表达式】从json数组中抽取id列表
			有如下数组,要从中取出id: "[\"3812662409\",\"3812633637\",\"3812627686\",\&q ... 
- html中<frameset>标签,框架结构各窗口的父级菜单子级菜单关系
			这个问题搞得我头大,并且在查过百度后各位大佬给出的解释我都不能理解,应该是我太白的原因,希望我写的能好理解. 下面文章窗口1.2.3,在代码里分别为chuangkou.chuangkou1.chuan ... 
