题意:

给你一幅图,你要用这些边构造一个树,

s和t两个节点的度数不能超过ds dt
而且图是保证没有环

思路:

树的性质是:无环(已经保证),无向(保证),连通(还要判断)

首先把S,T点从图里剥离出来,就是把S和T点搞成几个连通块

对于这些连通块有三种:只与S连的,只与T连的,还有一种是两个都连的,

然后就是要把S和T与那些连通块相连,保证连通。

由于对于S和T相连的点并不是连通块的老大,而且S和T连出去的点还可能同时在一个连通块里;

所以预处理一下S和T连接点的老大,塞到set里去去个重,连一个子节点或者就是他本身就好了;

中间还要判断S和T的连通性,最后再判断一下度数就好啦

PS:主要是要知道树的性质,还有就是要知道树的哪些边是一定要连的;

好菜啊!!!

#include <bits/stdc++.h>
using namespace std; const int N=2e5+10; vector<int>ma[N];
vector<int>ans[N],tt[N],ss[N];
set<int>s;
set<int>t;
int num[N];
int S,T;
int pre[N]; void dfs(int x,int k)
{
pre[x]=k;
for(int i=0;i<ma[x].size();i++)
{
//printf("%d\n",ma[x][i]);
if(ma[x][i]==S||ma[x][i]==T||pre[ma[x][i]])
continue;
ans[x].push_back(ma[x][i]);
dfs(ma[x][i],k);
}
} int main()
{
int n,m;
int x,y;
int ds,dt;
int ps,pt;
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&x,&y);
ma[x].push_back(y);
ma[y].push_back(x);
}
scanf("%d%d%d%d",&S,&T,&ds,&dt);
//首先剥离与s和t连通的东东;
memset(pre,0,sizeof(pre));
for(int i=1;i<=n;i++)
{
if(i==S||i==T||pre[i])
continue;
dfs(i,i);
}
//然后就是从s的一些连通块,或者从t出发的一些连通块
int flag=0;
ps=pt=0;
memset(num,0,sizeof(num));
//建下边,去个重;
for(int i=0;i<ma[S].size();i++)
{
if(ma[S][i]==T)
{
flag++;
continue;
}
s.insert(pre[ma[S][i]]);
ss[pre[ma[S][i]]].push_back(ma[S][i]);
}
for(int i=0;i<ma[T].size();i++)
{
if(ma[T][i]==S)
continue;
t.insert(pre[ma[T][i]]);
tt[pre[ma[T][i]]].push_back(ma[T][i]);
} set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
num[*it]++;
for(it=t.begin();it!=t.end();it++)
{
num[*it]++;
if(num[*it]==1)
{
ans[T].push_back(tt[*it][0]);
num[*it]=0;
pt++;
}
}
for(it=s.begin();it!=s.end();it++)
{
if(num[*it]==1)
{
ans[S].push_back(ss[*it][0]);
num[*it]=0;
ps++;
}
}
int ff=0;
for(it=s.begin();it!=s.end();it++)
{
if(num[*it]>1)
{
if(!ff)
{
ans[S].push_back(ss[*it][0]);
ans[T].push_back(tt[*it][0]);
ps++;
pt++;
ff=1;
continue;
}
if(ps<ds)
{
ans[S].push_back(ss[*it][0]);
ps++;
}
else//不行的话只能给T啊!!!;
{
ans[T].push_back(tt[*it][0]);
pt++;
}
}
}
if(!ff)//如果不能搞在一起的话
{
if(flag)//判断是否本来就在一起
{
ans[S].push_back(T);
ps++;
pt++;
}
else
{
puts("NO");
return 0;
}
}
if(ps>ds||pt>dt)
puts("No");
else
{
puts("Yes");
for(int i=1;i<=n;i++)
{
for(int j=0;j<ans[i].size();j++)
{
printf("%d %d\n",i,ans[i][j]);
}
}
}
return 0;
}

CodeForces 723F【DFS瞎搞】的更多相关文章

  1. Codeforces Gym 100610 Problem H. Horrible Truth 瞎搞

    Problem H. Horrible Truth Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1006 ...

  2. 8VC Venture Cup 2016 - Elimination Round B. Cards 瞎搞

    B. Cards 题目连接: http://www.codeforces.com/contest/626/problem/B Description Catherine has a deck of n ...

  3. HDU5971【瞎搞】

    题意:略(忙着准备文化课...明天期中考啊.... 思路: 正解就是染色,2-sat搞: AC代码(虽然是错误的...数据水(过踏马的也行啊,起码打脸他啊!) 4 3 1 0 1 2 2 3 3 4 ...

  4. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

  5. URAL 1203. Scientific Conference(瞎搞)

    题目链接 本来觉得这不是经典的贪心吗..果断水一次,wa了,看了看discuss,发现貌似不好水,土土的DP了一下,复杂度很高了,又T了...然后想想单调队列,二分什么的...不好往上加,直接搞了标记 ...

  6. B. Salty Fish Go! -期望题(瞎搞题)

    链接:https://www.nowcoder.com/acm/contest/104/B来源:牛客网 题意:A few days ago, WRD was playing a small game ...

  7. HDU5532 Almost Sorted Array(最长上升子序列 or 瞎搞个做差的数组)

    题目链接:点我 题意:给定一个序列,询问是否能删除一个数让它成为非递减或者非递增的序列. 比如说 删除后的序列是1 3 3 5 或者5 3 3 1 或者1 3 5 或者5 3 1 都可以.只要满足删掉 ...

  8. TOJ3097: 单词后缀 (字典树 or map瞎搞)

    传送门 (<---可以点击的~) 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...

  9. ubuntu--基础环境瞎搞集合

    安装ubuntu系统后有很多东西需要自己瞎搞一下,这里把一些瞎搞的过程记录在这里,方便以后重新装系统后重新配置. 一.安装. 可以在windows下制作启动盘(软碟通),然后开机u盘启动即可安装,预留 ...

随机推荐

  1. Python之Numpy库常用函数大全(含注释)

    前言:最近学习Python,才发现原来python里的各种库才是大头! 于是乎找了学习资料对Numpy库常用的函数进行总结,并带了注释.在这里分享给大家,对于库的学习,还是用到时候再查,没必要死记硬背 ...

  2. LeetCode(70)题解: climbing-stairs

    https://leetcode.com/problems/climbing-stairs/ 题目: You are climbing a stair case. It takes n steps t ...

  3. PHP收邮件receiveMail

    用PHP来发邮件,相信大家都不陌生,但读取收件箱的话,接触就少了,这次总结下自己的经验,希望能够帮助大家. 注意:1.PHP读取收件箱主要是利用imap扩展,所以在使用下面方法前,必须开启imap扩展 ...

  4. Grid++Report设置显示固定行数

    一.要实现的功能打印的报表显示固定的行数,并且设置字段的文字可以自动换行二.设置步骤1.鼠标左键单击“明细网格”栏,在右侧属性窗口中设置“追加空白行”属性值为:是:“追加空白行在后”属性值为:是.2. ...

  5. Redis(三)位图

    1.目录 什么是位图 位图的作用 基本使用 2.什么是位图 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB ...

  6. wprintf、wcout无法输出中文的解决方案

    在C语言中,若wprintf无法输出中文,调用函数setlocale(int category, const char *locale)设置locale即可输出中文 此方法也可用于C++中 例: #i ...

  7. HttpURLConnection 接收网络数据出现乱码问题

    由于接收的数据经过gZip处理过,所以在接受的时候也要处理,并且加上编码格式(没有会出现部分数据乱码): 具体代码实现如下: URL ul = new URL(url); HttpURLConnect ...

  8. 给第三方apk进行系统签名的几种方式【转】

    本文转载自:http://blog.csdn.net/luzhenrong45/article/details/47733053 版权声明:本文为博主原创文章,未经博主允许不得转载. -------- ...

  9. IC卡、ID卡、M1卡、射频卡的区别是什么

    IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC卡.ID卡.M1卡.射频卡的区别是什么,下面我们一起来看看吧. 所谓的IC卡就是集成电路卡,是继磁卡之后出现的又一种 ...

  10. 自动化测试框架selenium+java+TestNG——配置篇

    最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...