题目:http://codeforces.com/contest/732/problem/F

给无向图定向使得从每个点出发能去的点数最小值最大。

SCC。点内部dfs定向、点间以siz最大的为起点反向dfs。

自我感觉良好的自己写法:在新连边的时候只是操作一下 thd 和 tnxt 即可。

注意写了构造函数的话结构体成员的初值就不是自动赋值为0了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=4e5+5;
int n,m,cnt,col[N],hd[N],xnt=1,thd[N],txnt,siz[N];
int sta[N],top,low[N],dfn[N],tim;
bool vis[N],ins[N];
struct Ed{int tnxt,nxt,fr,to;bool use;Ed(int n=0,int f=0,int t=0):nxt(n),fr(f),to(t) {use=0;}//!!!use=0!!!
}ed[N<<1];
void add(int x,int y)
{ed[++xnt]=Ed(hd[x],x,y);hd[x]=xnt;ed[++xnt]=Ed(hd[y],y,x);hd[y]=xnt;
}
void tarjan(int cr,int fa)
{dfn[cr]=low[cr]=++tim;sta[++top]=cr;ins[cr]=1;for(int i=hd[cr],v;i;i=ed[i].nxt)if(ins[v=ed[i].to]&&v!=fa)low[cr]=min(low[cr],dfn[v]);else if(!dfn[v])tarjan(v,cr),low[cr]=min(low[cr],low[v]);if(dfn[cr]==low[cr]){cnt++;while(sta[top]!=cr)col[sta[top]]=cnt,ins[sta[top--]]=0,siz[cnt]++;top--;col[cr]=cnt;ins[cr]=0;siz[cnt]++;}
}
void dfsx(int cr,int fa)
{for(int i=thd[cr];i;i=ed[i].tnxt){if(col[ed[i].to]!=fa)ed[i^1].use=1,dfsx(col[ed[i].to],cr);}
}
void dfs(int cr,int fa)
{vis[cr]=1;for(int i=hd[cr],v;i;i=ed[i].nxt){if(col[v=ed[i].to]!=col[cr]||v==fa)continue;if(!ed[i^1].use)ed[i].use=1;//!if(!vis[v])dfs(v,cr);//!vis[v]!!
    }
}
int main()
{scanf("%d%d",&n,&m);int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);}tarjan(1,0);for(int i=2,u,v;i<=xnt;i++)if((u=col[ed[i].fr])!=(v=col[ed[i].to]))ed[i].tnxt=thd[u],thd[u]=i;int mx=0,k;for(int i=1;i<=cnt;i++)if(siz[i]>mx)mx=siz[i],k=i;printf("%d\n",mx);dfsx(k,0);for(int i=1;i<=n;i++)if(!vis[i])dfs(i,0);for(int i=2;i<=xnt;i+=2)if(ed[i].use)printf("%d %d\n",ed[i].fr,ed[i].to);else printf("%d %d\n",ed[i].to,ed[i].fr);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/9279557.html

CF 732F Tourist Reform——v-SCC+dfs相关推荐

  1. codeforces 732F Tourist Reform

    Problem 给出一个有n个点m条边的无向图,保证联通,现在要求将所有边给定一个方向使其变成有向图,设f(x)为点x能到达的点的个数,要求使最小的f(x)最大,并输出方案. 1≤n,m≤400000 ...

  2. CF732F Tourist Reform(dfs树、边双连通图、tarjan)

    因为知道了算法tag,所以想到了正解: 先给出两个性质: 边双给边定向一定可以转为强连通图,此为最优解 树给边定向后R的最小值必为0 性质2证明如下: 设树有n个节点, 若R_min!=0, 则每点出 ...

  3. cf 723e One-Way Reform

    题意:给你一个无向图,使其变为有向,让入度==出度的点最多. 思路: 想通一个点:只有度数为偶数的点可以满足条件.想通这一点之后可以跟奇点建立一些虚边,跑欧拉回路. 代码: #include < ...

  4. CF 375D. Tree and Queries加强版!!!【dfs序分块 大小分类讨论】

    传送门 题意: 一棵树,询问一个子树内出现次数$\ge k$的颜色有几种,Candy?这个沙茶自带强制在线 吐槽: 本来一道可以离散的莫队我非要强制在线用分块做:上午就开始写了然后发现思路错了...: ...

  5. 图论复习——dfs树,点双,边双,强连通分量

    知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...

  6. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

  7. CodeForces999E 双dfs // 标记覆盖 // tarjan缩点

    http://codeforces.com/problemset/problem/999/E 题意 有向图    给你n个点,m条边,以及一个初始点s,问你至少还需要增加多少条边,使得初始点s与剩下其 ...

  8. [CF/AT]各大网站网赛 体验部部长第一季度工作报告

    文章目录 CodeForces #712 (Div. 1)--1503 A. Balance the Bits B. 3-Coloring C. Travelling Salesman Problem ...

  9. Div1 小A抓小B tarjan双连通分量缩点+dfs

    题目描述 小A和小B在一个无向图G上进行一个游戏.图G是连通的,有n个点,n条边,无重边,无自环,结点编号为1~n.游戏开始前小A在结点x,小B在结点y(x≠y).游戏开始后,小A和小B轮流进行移动( ...

最新文章

  1. 南大周志华清华胡事民入围院士候选!计算机领域共计7人
  2. unity3d-高频率面试题目
  3. 编译安装Ruby 1.9.3 安装CentOS
  4. 初等数学O 集合论基础 第六节 商集
  5. python怎么反转单链表_单链表反转python实现代码示例
  6. Python3字符串填充和对齐代码示例
  7. SDUT-SQL题解
  8. 20个Pandas数据实战案例,干货多多
  9. 20181120-1 每周例行报告
  10. c++ 嵌套类 内部类
  11. 乐观锁的颗粒度_MySql数据库锁机制详解
  12. 同时画多个饼图_手帐术 | 这个神奇饼图里,藏着时间管理的小秘诀
  13. C语言课后习题(28)
  14. Linux的shell编程(三)
  15. c++ 打印条码_条码标签打印软件快捷键指南
  16. 【设计模式】适配器模式(Adapter Pattern)
  17. 关于RDP报表工具参数配置
  18. JESD204B协议基础知识
  19. mac重置显示器设置
  20. 两个鸡蛋100层楼(DP)

热门文章

  1. clannad手游汉化版_clannad游戏中文版
  2. CodeForces 1000A Codehorses T-shirts
  3. 机器人军团防护罩_冒险岛贴吧 - 1000A导轨保护罩Y轴保护盖板的简单介绍
  4. python爬虫学习笔记(三)——淘宝商品比价实战(爬取成功)
  5. WPF 触发器Triggers
  6. 基于android的汽车租赁出租车打车洗车app
  7. 搜索引擎使用小技巧(通配符)
  8. 别忽略国美之争的真正遗产
  9. 【数仓设计】宽表和窄表
  10. python前端开发招聘_【天津前端开发招聘_最新天津前端开发招聘信息】-前程无忧...