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 生成树的更多相关文章

  1. Codeforces Round #375 (Div. 2) F. st-Spanning Tree

    传送门 分析:构造题.可以这么想:先把s,t两个点去掉,把剩下的点先并查集合并.这样会出现个集合:, , 个剩余集合.那么个集合中先把只能与或中一个相连的连起来,如果这样已经超出了要求,那么就不能构造 ...

  2. Codeforces Round #486 (Div. 3) F. Rain and Umbrellas

    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...

  3. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  4. Codeforces Round #501 (Div. 3) F. Bracket Substring

    题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...

  5. Codeforces Round #499 (Div. 1) F. Tree

    Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...

  6. Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)

    题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...

  7. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  8. 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 ...

  9. 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 题意: 给出一颗点有权值的树 ...

随机推荐

  1. [python]文件操作read&readline&readlines

    (1)read是将整个文件读入内存,将整个文件的内容当作一个字符串 (2)readline是一行一行的读如内存,每一次读的一行为一个字符串 (3)readlines是一次将整个文件读入内存,但是将整个 ...

  2. scala笔记之惰性赋值(lazy)

    一.lazy关键字简介 lazy是scala中用来实现惰性赋值的关键字,被lazy修饰的变量初始化的时机是在第一次使用此变量的时候才会赋值,并且仅在第一次调用时计算值,即值只会被计算一次,赋值一次,再 ...

  3. 【配置】Spring和MyBatis整合

    spring配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...

  4. Windows中用“ls”命令

    解决办法是: 在C:\Windows\System32目录下新建文本文档,文件内容为: @echo off dir 另存为“ls.bat” 类型为所有文件,编码ANSI 可使用dir 或者ls都可以 ...

  5. Quartus II 破解教程—FPGA入门教程【钛白Logic】

    这一节主要说明如何破解Quartus II 13.1.首先找到我们提供的破解工具,这里我们的电脑是64位的,所以使用64位破解器.如下图. 第一步:将破解工具拷贝到安装目录下“D:\altera\13 ...

  6. Heapify

    Given an integer array, heapify it into a min-heap array. For a heap array A, A[0] is the root of he ...

  7. C++的那些事 1

    最近在看c++的一些库文件,里面的一些比较陌生但看起来挺有用的一些东西,在此记下,以免日后看到再翻找资料. template <size_t _Nb> 这是在看bitset的时候看到的,之 ...

  8. Google-Guice入门介绍

    原地址:http://blog.csdn.net/derekjiang/article/details/7231490 一. 概述 Guice是一个轻量级的DI框架.本文对Guice的基本用法作以介绍 ...

  9. css-实现图标在输入框中显示

    一:JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有 ...

  10. ssh隐藏的sftp功能的使用

    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...