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 题意: 给出一颗点有权值的树 ...
随机推荐
- HDU 2509 基础Anti-SG NIM
如果我们规定当局面中所有的单一游戏的SG值为0时,游戏结束,则先手必胜当且仅当:(1)游戏的SG!=0 && 存在单一游戏的SG>1:(2)游戏的SG==0 && ...
- CS229 笔记03
CS229 笔记03 局部加权线性回归 Non-Parametric Learning Algorithm (非参数学习方法) Number of parameters grows with the ...
- excel中数字如何自动换行
1. excel中点击单元格右键,选择“设置单元格格式” -- “对齐”选项卡. 2. 先取消“自动换行”,勾选上“缩小字体填充”. 3.再选择“自动换行”即可实现数字的自动换行.
- cmd命令,bat脚本
1.cd /d D:\>cd mysql D:\mysql>cd /d C:/TEMP C:\Temp>cd /? 显示当前目录名或改变当前目录. CHDIR [/D] [drive ...
- 【ARTS】01_05_左耳听风-20181210~1216
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【译】在Asp.Net Core 中使用外部登陆(google、微博...)
原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET Core> (本文很长) 摘要:本文主要介绍了使用外部登陆提供程序登陆的 ...
- shell升级完整记录
[root@localhost bash-4.3.30]# cat Makefile |grep prefix prefix = /usr/local exec_prefix = ${prefix} ...
- Coursera台大机器学习技法课程笔记13-Deep Learning
深度学习面临的问题和现在解决的办法: 简要来说,分两步使用DL:初始化时一层一层的选择权重,而后再进行训练: 那么怎么做pre-training,即怎么选择权重呢?好的权重能够不改变原有资料的信息,即 ...
- Coursera台大机器学习技法课程笔记11-Gradient Boosted Decision Tree
将Adaboost和decision tree相结合,需要注意的地主是,训练时adaboost需要改变资料的权重,如何将有权重的资 料和decision tree相结合呢?方法很类似于前面讲过的bag ...
- TcxGrid 调整列位置的事件