Codeforces Round #375 (Div. 2) F. st-Spanning Tree 生成树
F. st-Spanning Tree
题目连接:
http://codeforces.com/contest/723/problem/F
Description
You are given an undirected connected graph consisting of n vertices and m edges. There are no loops and no multiple edges in the graph.
You are also given two distinct vertices s and t, and two values ds and dt. Your task is to build any spanning tree of the given graph (note that the graph is not weighted), such that the degree of the vertex s doesn't exceed ds, and the degree of the vertex t doesn't exceed dt, or determine, that there is no such spanning tree.
The spanning tree of the graph G is a subgraph which is a tree and contains all vertices of the graph G. In other words, it is a connected graph which contains n - 1 edges and can be obtained by removing some of the edges from G.
The degree of a vertex is the number of edges incident to this vertex.
Input
The first line of the input contains two integers n and m (2 ≤ n ≤ 200 000, 1 ≤ m ≤ min(400 000, n·(n - 1) / 2)) — the number of vertices and the number of edges in the graph.
The next m lines contain the descriptions of the graph's edges. Each of the lines contains two integers u and v (1 ≤ u, v ≤ n, u ≠ v) — the ends of the corresponding edge. It is guaranteed that the graph contains no loops and no multiple edges and that it is connected.
The last line contains four integers s, t, ds, dt (1 ≤ s, t ≤ n, s ≠ t, 1 ≤ ds, dt ≤ n - 1).
Output
If the answer doesn't exist print "No" (without quotes) in the only line of the output.
Otherwise, in the first line print "Yes" (without quotes). In the each of the next (n - 1) lines print two integers — the description of the edges of the spanning tree. Each of the edges of the spanning tree must be printed exactly once.
You can output edges in any order. You can output the ends of each edge in any order.
If there are several solutions, print any of them.
Sample Input
3 3
1 2
2 3
3 1
1 2 1 1
Sample Output
Yes
3 2
1 3
Hint
题意
给你一个无向图,问你能不能找到一颗生成树,使得这个生成树包含S点和T点,且S点的度数不超过DS,T点的度数不超过DT
题解:
我们首先把S点和T点都拿走,然后跑一个生成树,那么现在的图就是一个森林了。
首先我们让S和T都连到同一个连通块去。
然后再贪心的去连,S优先连T不能够连接的连通块,再让T连接S不能连接的连通块,再去连接都能够连接的连通块。
其实感觉上是一个乱搞题[二哈]
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
vector<pair<int,int> >ans;
vector<int>E[maxn];
int s,t,ds,dt,fa[maxn],vis[maxn],n,m,link1[maxn],link2[maxn];
vector<int> c;
int fi(int x)
{
return fa[x]==x?x:fa[x]=fi(fa[x]);
}
void uni(int x,int y)
{
x=fi(x),y=fi(y);
fa[x]=y;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
E[x].push_back(y);
E[y].push_back(x);
}
for(int i=1;i<=n;i++)
fa[i]=i;
scanf("%d%d%d%d",&s,&t,&ds,&dt);
for(int i=1;i<=n;i++)
{
if(i==s||i==t)continue;
for(int j=0;j<E[i].size();j++)
{
int v=E[i][j];
if(v==s||v==t)continue;
if(fi(i)!=fi(v))
{
ans.push_back(make_pair(i,v));
uni(i,v);
}
}
}
int flag = 0;
for(int i=0;i<E[s].size();i++)
{
int v=E[s][i];
link1[fi(E[s][i])]=1;
}
for(int i=0;i<E[t].size();i++)
{
int v=E[t][i];
link2[fi(E[t][i])]=1;
}
if(!flag)
{
for(int i=0;i<E[t].size();i++)
{
int v=E[t][i];
if(link1[fi(v)])
{
vis[fi(v)]=1;
dt--;
ans.push_back(make_pair(t,v));
uni(t,v);
break;
}
}
for(int i=0;i<E[s].size();i++)
{
int v=E[s][i];
if(vis[v])
{
ds--;
ans.push_back(make_pair(s,v));
uni(s,v);
break;
}
}
}
for(int i=0;i<E[s].size();i++)
{
if(!link2[E[s][i]]&&ds&&fi(s)!=fi(E[s][i]))
{
ans.push_back(make_pair(s,E[s][i]));
uni(s,E[s][i]);
ds--;
}
}
for(int i=0;i<E[t].size();i++)
{
if(!link1[E[t][i]]&&dt&&fi(t)!=fi(E[t][i]))
{
ans.push_back(make_pair(t,E[t][i]));
uni(t,E[t][i]);
dt--;
}
}
for(int i=0;i<E[s].size();i++)
{
if(ds&&fi(s)!=fi(E[s][i]))
{
ans.push_back(make_pair(s,E[s][i]));
uni(s,E[s][i]);
ds--;
}
}
for(int i=0;i<E[t].size();i++)
{
if(dt&&fi(t)!=fi(E[t][i]))
{
ans.push_back(make_pair(t,E[t][i]));
uni(t,E[t][i]);
dt--;
}
}
if(fi(s)!=fi(t))
{
for(int i=0;i<E[s].size();i++)
{
if(E[s][i]==t)
{
uni(s,t);
ans.push_back(make_pair(s,t));
}
}
}
if(ans.size()==n-1)
{
cout<<"Yes"<<endl;
for(int i=0;i<ans.size();i++)
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
else
cout<<"No"<<endl;
}
Codeforces Round #375 (Div. 2) F. st-Spanning Tree 生成树的更多相关文章
- Codeforces Round #375 (Div. 2) F. st-Spanning Tree
传送门 分析:构造题.可以这么想:先把s,t两个点去掉,把剩下的点先并查集合并.这样会出现个集合:, , 个剩余集合.那么个集合中先把只能与或中一个相连的连起来,如果这样已经超出了要求,那么就不能构造 ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #501 (Div. 3) F. Bracket Substring
题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)
题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...
- Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树
https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- Codeforces Round #525 (Div. 2) F. Ehab and a weird weight formula
F. Ehab and a weird weight formula 题目链接:https://codeforces.com/contest/1088/problem/F 题意: 给出一颗点有权值的树 ...
随机推荐
- bzoj千题计划248:bzoj3697: 采药人的路径
http://www.lydsy.com/JudgeOnline/problem.php?id=3697 点分治 路径0改为路径-1 g[i][0/1] 和 f[i][0/1]分别表示当前子树 和 已 ...
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- Java入门系列(八)多线程
基本线程类指的是Thread类,Runnable接口,Callable接口 典型多线程问题 生产者-消费者 死锁问题
- [整理]JS中的状态机
/*StateMachine*/ var StateMachine = (function(){ function StateMachine(opts){ this.current = opts.in ...
- shell 流程结构
if 判断语句 if [ $a == $b ] then echo "等于" else echo "不等于" fi case分支选择 case $xs in ) ...
- C - Balanced Number HDU - 3709 (数位dp)
题目链接:https://cn.vjudge.net/contest/278036#problem/C 题目大意:手首先是T组数据,然后每一次输入两个数l,r,求这个区间里面满足以某个数字为中心的两侧 ...
- oracle开机自启,开机自动关闭防火墙,开机监听自启
1.修改oratab 2,修改rc.local 3.关闭防火墙,设置开机时清空所有规则 参考文章: 1.https://blog.csdn.net/weeknd/article/details/726 ...
- mount过程分析之一(基于3.16.3内核)【转】
转自:https://blog.csdn.net/zr_lang/article/details/39963253 一直想写有些关于文件系统的博文,但是由于近一年来实在太忙,所以没有时间写.前几日赶上 ...
- crontab机会任务监控
<1>如何查看自己的计划任务是否成功的执行? 昨天crontab中的同步任务没有执行,不知道是什么原因没有执行,貌似任务hang住了,想查询一下crontab到底问题出在哪里,或者hang ...
- 为你的 Hadoop 集群选择合适的硬件
随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...