【题目链接】: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的更多相关文章

  1. 【19.27%】【codeforces 618D】Hamiltonian Spanning Tree

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. 【27.91%】【codeforces 734E】Anton and Tree

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. 【codeforces 791D】 Bear and Tree Jumps

    [题目链接]:http://codeforces.com/contest/791/problem/D [题意] 你可以从树上的节点一次最多走k条边. (称为跳一次); 树为无权树; 然后问你任意两点之 ...

  4. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  5. 【27.48%】【codeforces 699D】 Fix a Tree

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. 【Codeforces 1086B】Minimum Diameter Tree

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 统计叶子节点个数m 把每条和叶子节点相邻的边权设置成s/cnt就可以了 这样答案就是2*s/m(直径最后肯定是从一个叶子节点开始,到另外一个叶 ...

  7. 【Codeforces 161D】Distance in Tree

    [链接] 我是链接,点我呀:) [题意] 问你一棵树上有多少条长度为k的路径 [题解] 树形dp 设 size[i]表示以节点i为根节点的子树的节点个数 dp[i][k]表示以i为根节点的子树里面距离 ...

  8. 【codeforces 698B】 Fix a Tree

    题目链接: http://codeforces.com/problemset/problem/698/B 题解: 还是比较简单的.因为每个节点只有一个父亲,可以直接建反图,保证出现的环中只有一条路径. ...

  9. 【CodeForces 699D】Fix a Tree

    dfs找出联通块个数cnt,当形成环时,令指向已访问过节点的节点变成指向-1,即做一个标记.把它作为该联通图的根. 把所有联通的图变成一颗树,如果存在指向自己的点,那么它所在的联通块就是一个树(n-1 ...

随机推荐

  1. iOS GCD使用指南

    Grand Central Dispatch(GCD)是异步运行任务的技术之中的一个. 一般将应用程序中记述的线程管理用的代码在系统级中实现.开发人员仅仅须要定义想运行的任务并追加到适当的Dispat ...

  2. Bootstrap的js插件之警告框(alert.js)

    data-dismiss="alert"--为关闭button加入该属性能够使其自己主动为警告框赋予关闭功能. .fade .in--为警告框在关闭时加入动画效果. 很多其它细节參 ...

  3. 调试中的step into step over step out

    step into/step out/step over的差别 step into就是单步运行,遇到子函数就进入而且继续单步运行: step over是在单步运行时,在函数内遇到子函数时不会进入子函数 ...

  4. A - Red and Black(3.2.1)(搜索)

    A - Red and Black(3.2.1) Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & ...

  5. 关于jetty服务器默认首页和端口设置

    一.jetty服务器部署.启动成功后,在浏览器输入http://localhost:8080/ 可以直接访问到jetty欢迎首页. 这是因为在Jetty包中默认带了一个test.war的应用,在${J ...

  6. 2.2.3 修改JSX代码

    /** * Sample React Native App * https://github.com/facebook/react-native * @flow */ import React, { ...

  7. Object源码分析(一)

    刚注册博客,准备学习一下java源码,当然首先从Object看起. 介绍一下Object: Object是所有类层次结构的根,所有的类都将Object作为超类.所有的对象,包括数组,都实现了Objec ...

  8. (转载) 小议TCP的MSS(最大分段)以及MTU(最大传输单元)

    [背景知识]  MTU: Maximum Transmission Unit 最大传输单元 MSS: Maximum Segment Size 最大分段大小PPPoE: PPP Over Ethern ...

  9. vue-cli3+typescript+router

    vue基于类的写法,和基于对象的写法并不一致.使用vue-cli3创建的项目,src目录下的文件结构并没有多大区别,store.router.app.view.components.aeests该有的 ...

  10. javascript中对象两种创建方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...