Codeforces Round #377 (Div. 2) F

来源:互联网 发布:衣服好看又好的淘宝店 编辑:程序博客网 时间:2024/05/16 03:54

题意:

给定一张n个点m条边的无向图,保证连通,无自环,要求给边定向,定义一个点的权值ri,为从这个点出发,能够到达的点的数目,求一个使得最小ri最大的方案并打印出

solution:

对于双连通分量,一定能找出一种方案,使得这个边双中的任意两点能互达(废话--),那么对于这个边双,这样定向显然是最优的。。

把无向图中所有边双缩点,那么剩下一棵树,树上的边就是原图中的桥边,尝试给桥边定向,可以发现,a->b这条边,可以给b贡献sizea,以及所有能走到a的点贡献sizea,然后,桥边的定向总是能搞出一条条链,而每条链的尽头的那个点,一定没办法享受任何一个双连通分量的贡献!那么显然,我们让原本size最大的那个点当这样的点,一定是最优方案

至于边双内部的边的定向,任意找一个点,一直dfs,按照dfs的顺序定向即可。。。(感觉很显然啊--)

#include<iostream>#include<cstdio>#include<queue>#include<vector>#include<bitset>#include<algorithm>#include<cstring>#include<map>#include<stack>#include<set>#include<cmath>#include<ext/pb_ds/priority_queue.hpp>using namespace std;const int maxn = 4E5 + 40;struct E{int to,num;E(){}E(int to,int num): to(to),num(num){}};int n,m,dfs_clock,tot,au[maxn],av[maxn],low[maxn],dfn[maxn],siz[maxn],bel[maxn],p[maxn];bool brg[maxn],v1[maxn],v2[maxn],v3[maxn];vector <E> v[maxn];void Mark(int x,int fa){bel[x] = tot;++siz[tot];for (int i = 0; i < v[x].size(); i++) {int to = v[x][i].to;if (to == fa) continue;int num = v[x][i].num;if (brg[num]) continue;if (!au[num]) {au[num] = x;av[num] = to;}if (v2[to]) continue;v2[to] = 1;Mark(to,x);}}void Dfs(int x,int fa){dfn[x] = low[x] = ++dfs_clock;for (int i = 0; i < v[x].size(); i++) {int to = v[x][i].to;if (to == fa) continue;if (!v1[to]) {v1[to] = 1; Dfs(to,x);low[x] = min(low[x],low[to]);if (low[to] == dfn[to]) {brg[v[x][i].num] = 1;v2[p[++tot] = to] = 1;Mark(to,0);}}else low[x] = min(low[x],low[to]);}}void Dfs2(int x,int fa){for (int i = 0; i < v[x].size(); i++) {int to = v[x][i].to;if (to == fa) continue;int num = v[x][i].num;if (brg[num] && !au[num]) {au[num] = to;av[num] = x;}if (v3[to]) continue;v3[to] = 1;Dfs2(to,x);}}int main(){#ifdef DMCfreopen("DMC.txt","r",stdin);#endifcin >> n >> m;for (int i = 1; i <= m; i++) {int x,y; scanf("%d%d",&x,&y);v[x].push_back(E(y,i));v[y].push_back(E(x,i));}v1[1] = 1;Dfs(1,0);v2[p[++tot] = 1] = 1;Mark(1,0);int s,ans = 0;for (int i = 1; i <= tot; i++)if (siz[i] > ans) ans = siz[i],s = p[i];v3[s] = 1;Dfs2(s,0);cout << ans << endl;for (int i = 1; i <= m; i++)printf("%d %d\n",au[i],av[i]);return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 白衣服漂黄了怎么办 孩子挑衣服穿怎么办 馒头店生意不好怎么办 白连裤袜染色了怎么办 人比较胖校服怎么办 幼儿撕书老师怎么办 夏天面试要求穿正装怎么办 面试要求穿正装没有怎么办 面试没有正装怎么办 退烧药服用过量怎么办 小孩喝洗衣粉水怎么办 小孩误食沐浴露怎么办 三个月宝宝腿弯怎么办 宝宝背带裤老掉怎么办 羽绒服洗完结块怎么办 天猫保证金被骗怎么办 飞机杯发霉了怎么办 背带裤裆太大了怎么办 宝宝开裆裤裆太大怎么办 a字裙太大怎么办 棉衣服缩水了怎么办 百褶裙子大了怎么办 皮鞋有黑色划痕怎么办 天猫搜索不了怎么办 帆布鞋穿着脚臭怎么办 运动鞋磨脚踝骨怎么办 运动鞋挂烂了怎么办 网状运动鞋烂了怎么办 运动鞋臭怎么办快速去除 天猫预售退货怎么办 肯德基兑换券过期了怎么办 直通车上10之后怎么办 淘宝没有评论过怎么办 爱上街虚假发货怎么办 天猫差评被置顶了一天怎么办 天猫跨店满减其中订单退款怎么办 天猫618津贴不够怎么办 鼻子上长大包怎么办 净水器滤芯漏水怎么办 京东忘记用户名怎么办 详情页图片模糊怎么办