【题目链接】: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. likely, unlikely的作用

    在项目中看到了likely.unlikely宏的使用, 一直不是非常清楚它们的作用,所以就深究下. likely表示被測试的表达式大多数情况下为true, unlikely则表示相反. 两个宏定义: ...

  2. Cache 总结

    这一文,让我们分析一下,<浅谈 Cache> 一文中的奇怪现象,事实上如今来看也并不奇怪了.         在什么情况下 r1 和 r2 都为 0 呢?         细致看代码,你会 ...

  3. JS 滚动条事件

    当滚动条滚动到最底部出发事件: $(window).scroll(function(){ if($(document).height()-$(this).scrollTop()-$(this).hei ...

  4. Java读源代码学设计模式:适配器Adapter

    适配器模式相关源代码:slf4j-1.6.1.hibernate-3.6.7 大家都知道.log4j是一个广泛使用的日志工具,除此之外.sun公司在JDK中也有自己的日志工具,也就是java.util ...

  5. 车载导航系统中GPS的定位

    首先购买的车载导航系统有GPS信号接受功能,能够接收GPS的经纬度信号,然后导航终端里面安装的导航地图能够非常详细的显示详细的经纬度坐标和地物信息.导航终端通过接收器接收到卫星24小时不间断发射的免费 ...

  6. Window上python 开发--1.搭建开发环境

    事实上在开发python最好在ubuntu环境下,简单也便于扩展各个package.可是我的linux的电脑临时不在身边.还的我老婆的电脑win7没办法啊. 因为python的跨平台性.在window ...

  7. Linux下安装JRE和Eclipse IDE for C/C++ Developers

    Linux32位,下载eclipse-cpp-luna-R-linux-gtk.tar.gz和jre-8u11-linux-i586.rpm  放到家文件夹中. http://www.eclipse. ...

  8. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  9. JDBC数据库中表更新

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...

  10. O - Masha and Bears

    Problem description A family consisting of father bear, mother bear and son bear owns three cars. Fa ...