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 题意: 给出一颗点有权值的树 ...
随机推荐
- Extending Markov to Hidden Markov
Extending Markov to Hidden Markov a tutorial on hidden markov models, Hidden Markov Models, hidden m ...
- dedecms在linux上安装提示没权限解决办法
web服务器运行的用户与目录所有者用户必须不一样,比如apache运行的用户为root,那么网站目录设置的所有者就应该不能设置为root,而是设置不同于root的用户,如apache. 我们这里假设w ...
- spring框架学习(四)AOP思想
什么是AOP 为什么需要AOP 从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力.事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问 ...
- svn使用笔记
一.checkout:第一次下载trunk里面的代码到本地 二.commit:提交一些修改* out of date : 本地版本号 < 服务器版本号* 如果过期,就update,可能会出现co ...
- linux压缩日志并删除原始文件
下面的脚本可以压缩日志并删除原始文件 #!/bin/bash yesterday=`date -d '1days ago' +%Y_%m_%d` cd $ find . -name "*$y ...
- Project Euler Problem2
Even Fibonacci numbers Problem 2 Each new term in the Fibonacci sequence is generated by adding the ...
- C#: +(特性 ) + Attitude C#(类)前面或者(方法)前面 (中括号)定义
首先要说的是,可能一些刚接触C#的朋友常常容易把属性(Property)跟特性(Attribute)弄混淆,其实这是两种不同的东西.属性就是面向对象思想里所说的封装在类里面的数据字段,其形式为: 1: ...
- python抓取猫眼电影列表
抓取地址:http://maoyan.com/board/4 分析url分页规则:http://maoyan.com/board/4?offset=0 其中offset参数值为0到90 用到的库: P ...
- Coursera台大机器学习技法课程笔记14-Radial Basis Function Network
将Radial Basis Function与Network相结合.实际上衡量两个点的相似性:距离越近,值越大. 将神经元换为与距离有关的函数,就是RBF Network: 可以用kernel和RBF ...
- 为什么尽量别用 setInterval
为什么尽量别用setInterval 在开发一个在线聊天工具时,经常会有过多少毫秒就重复执行一次某操作的需求.“没问题”,大家都说,“用setInterval好了.”我觉得这个点子很糟糕. 原因之 ...