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 #271 (Div. 2) F. Ant colony (RMQ or 线段树)

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

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

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

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

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

  9. CodeForces Round #515 DIv.3 F. Yet another 2D Walking

    http://codeforces.com/contest/1066/problem/F Maksim walks on a Cartesian plane. Initially, he stands ...

随机推荐

  1. PHP扩展安装mcrypt 提示没有可用包(No package php-mcrypt available)

    一.用CentOS的朋友基本在安装软件的时候默认都会想到用yum安装省事省时而且不会有错不需要担心依赖问题. php大部分的扩展都是可以再yum源里安装的,但是部分扩展是没有的,需要安装epel-re ...

  2. jquey on

    1.如果你的元素是用clone方法复制出来的,并且,用了on来绑定事件的话,必须在clone的后边添加true,负责你的事件不会生效. 2.必须在on $('.js-liubody').on('cli ...

  3. JQuery对表格进行排序

    添加相关jar <script type="text/javascript" src="jquery-1.1.3.pack.js"></scr ...

  4. js正则验证&quot;汉字&quot;

    var nickname = value; var regex = new RegExp("^([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z0-9_]){1 ...

  5. Unable to start T-SQL Debugging. Could not connect to the computer ‘.’

    Unable to start T-SQL Debugging. Could not connect to the computer ‘.’ 在Win7上面使用SSMS连接到SQL Server使用D ...

  6. manacher模板(manacher)

    洛谷题目传送门 写完有一段时间了,发现板子忘记存在了这里...... 算法简述 一种字符串算法,\(O(n)\)高效求出以每个字符为对称中心的最长回文串长度. 然后,就可以进一步求出全串中最长回文串的 ...

  7. ListView中ConvertView和ViewHolder

    1.概述 ListView是Android中非常常见的控件通过Adapter架起数据与界面显示的桥梁,MVC思想在其中得到了很好地体现: M:model 数据模型    添加到ListView中显示的 ...

  8. 在GNU/Linux下制作Windows 10安装U盘

    今年春节回家期间,我需要将家里的一台安装了Debian Stretch的ZaReason笔记本电脑更换为Windows 10系统,好让爸妈从老台式机上的XP系统升级到新的平台上来.回家前,小仙女已在微 ...

  9. pycharm上传代码到github

    一.配置pycharm 点击create API,添加自己的github账号,切记将clone git 那个对勾去掉,不然会报: Successfully created project ‘…’ on ...

  10. HUAWEI USG6000系列 &amp; NGFW Module V100R001 典型配置案例

    https://support.huawei.com/enterprise/zh/doc/DOC1000047742?section=j00d