洛谷P2835 刻录光盘
2017-10-22 20:59
134 查看
题目大意:有光盘可以传着看,问最少从哪几个人分发,能全部传一遍。
题解:缩点后求入度为0的点的个数
代码:
#include<iostream> #include<cstdio> #include<cstring> #define maxn 22000 using namespace std; int n,sumedge,sumclr,top,tim,ans; int Stack[maxn],instack[maxn],low[maxn],dfn[maxn],bel[maxn],rd[maxn],head[maxn]; struct Edge{ int x,y,nxt; Edge(int x=0,int y=0,int nxt=0): x(x),y(y),nxt(nxt){} }edge[maxn<<1]; void add(int x,int y){ edge[++sumedge]=Edge(x,y,head[x]); head[x]=sumedge; } void Tarjian(int x){ Stack[++top]=x;instack[x]=true; low[x]=dfn[x]=++tim; for(int i=head[x];i;i=edge[i].nxt){ int v=edge[i].y; if(instack[v])low[x]=min(low[x],dfn[v]); else if(!dfn[v]){ Tarjian(v); low[x]=min(low[x],low[v]); } } if(low[x]==dfn[x]){ sumclr++; while(Stack[top+1]!=x){ bel[Stack[top]]=sumclr; instack[Stack[top]]=false; top--; } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ int x; while(1){ scanf("%d",&x); if(!x)break; add(i,x); } } for(int i=1;i<=n;i++)if(!dfn[i])Tarjian(i); for(int x=1;x<=n;x++){ for(int i=head[x];i;i=edge[i].nxt){ int v=edge[i].y; if(bel[x]!=bel[v])rd[bel[v]]++; } } for(int i=1;i<=sumclr;i++)if(!rd[i])ans++; printf("%d\n",ans); return 0; }AC
相关文章推荐
- 洛谷P2835 刻录光盘 [2017年6月计划 强连通分量02]
- 洛谷 P2835 刻录光盘
- SSL 2344 洛谷 2835 信息学奥赛一本通 1383 刻录光盘
- ssl2344&P2835-刻录光盘【Floyd,联通块数,图论】
- 如何利用Red Hat Linux9 下载的ISO到安装光盘的刻录
- 光盘刻录知识
- 如何刻录数据光盘
- 用Nero刻录ISO镜像制作启动光盘
- 如何装配vixta之一-如何利用Nero将vixta刻录成ISO光盘
- windows7中把ISO文件轻松刻录成光盘的方法(图文教程)
- 手把手教你 使用会声会影把DVD视频如何刻录到光盘
- 刻录光盘
- 刻录光盘
- 刻录ISO镜像文件及超刻870M大容量光盘的方法
- 第九套广播体操视频下载 高清MPG 可刻录光盘293MB
- Linux下的光盘刻录
- 如何检验光盘镜像(ISO格式文件)并刻录系统安装光盘?
- 如何使用nero刻录数据光盘(转)
- Wii游戏光盘刻录 完全教学
- [转]raid驱动刻录成光盘