/*先吐槽下,刚开始没看懂题,以为只能是一个连通图0T0
题意:给你一个有向图,求G图中从v可达的所有点w,也都可以达到v,这样的v称为sink.求这样的v.
解;求强连通+缩点。求所有出度为0的点即为要求的点。
注意:可能有多个联通分支。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 5100
struct node {
int u,v,w,next;
}bian[N*N*2];
int head[N],yong,cnt,vis[N],stac[N],top,index,n,low[N],dfn[N],belong[N],outdegree[N];
void addedge(int u,int v) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
int cmp(const void *a,const void *b) {
return *(int *)a-*(int *)b;
}
void init() {
yong=0;
memset(head,-1,sizeof(head));
top=0;cnt=0;
index=0;
memset(vis,0,sizeof(vis));
memset(stac,0,sizeof(stac));
memset(outdegree,0,sizeof(outdegree));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(belong,0,sizeof(belong));
}
int Min(int a,int b) {
return a>b?b:a;
}
void tarjan(int u) {
low[u]=dfn[u]=++index;
stac[++top]=u;
vis[u]=1;
int i;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(!dfn[v]) {
tarjan(v);
low[u]=Min(low[u],low[v]);
}
else
if(vis[v])
low[u]=Min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
cnt++;
int t;
do {
t=stac[top--];
belong[t]=cnt;
vis[t]=0;
}while(t!=u);
}
}
int main() {
int m,i,a,b,j;
while(scanf("%d",&n),n) {
init();
scanf("%d",&m);
while(m--) {
scanf("%d%d",&a,&b);
addedge(a,b);
}
for(i=1;i<=n;i++)//缩点
if(!dfn[i])
tarjan(i);
//printf("%d\n",cnt);
for(i=0;i<yong;i++) {
a=bian[i].u;
b=bian[i].v;
if(belong[a]!=belong[b])
outdegree[belong[a]]++;
}
top=0;
for(i=1;i<=cnt;i++)
if(outdegree[i]==0) {//找出度为0的点
for(j=1;j<=n;j++)
if(belong[j]==i)
stac[top++]=j;
}
qsort(stac,top,sizeof(int),cmp);//排序
for(i=0;i<top-1;i++)//
printf("%d ",stac[i]);
printf("%d\n",stac[top-1]);
}
return 0;
}

最新文章

  1. jQuery选择器笔记
  2. [webpack] devtool配置对比
  3. webpack入坑之旅(二)loader入门
  4. 【POJ水题完成表】
  5. 【转】编译quickfast解析库(沪深level2行情转码库)
  6. html的转码玉反转码
  7. sqlmap.config 配置
  8. Echarts - js
  9. PE文件数字签名信息读取存储及格式具体解释图之上(历史代码,贴出学习)
  10. 字体图标 icon font
  11. c# PictureBox 的图像上使用鼠标画矩形框
  12. vue element-ui 文件上传
  13. 分布式监控系统开发【day38】:报警策略队列处理(五)
  14. hadoop与hbase对应的支持版本
  15. 应用分类&amp;练手项目计划
  16. JS事件基础
  17. java-过滤器、拦截器
  18. pyqt5 设置窗口按钮等可用与不可用
  19. 【JVM译文】JVM问题定位前的准备工作有哪些
  20. Object C学习笔记6-如何在Windows环境搭建Object C开发环境

热门文章

  1. Spark 操作Hive 流程
  2. Rails&#160;mysql数据库连接的小坑
  3. eclipse----快速设置主题色
  4. El Dorado(dp)
  5. phpexecl 的基本操作
  6. go 学习成长之路
  7. find_in_set的用法(某个字段包含某个字符)
  8. hadoop一主一从部署(1)
  9. Android Market google play store帐号注册方法流程 及发布应用注意事项【转载】
  10. 组合的json文件分隔或者拆分