pku 2553 The Bottom of a Graph 强连通分量+缩点

这类题目遇到好几条了,不想解释了,蓝皮书上有个学校软件援助计划,poj上也有原题,这题太裸了,不解释。。
 1 # include <stdio.h>
 2 # include <string.h>
 3 # include <stdbool.h>
 4 # include <stdlib.h>
 5 # define min(a,b) ((a)<(b)?(a):(b))
 6 bool map[5005][5005];
 7 int n,m;
 8 int dfn,id[5005],low[5005],con[5005],cn,stack[5005],top,res[5005],rc;
 9 bool count[5005];
10 int cmp(const void *a,const void *b)
11 {
12     return *(int *)a-*(int *)b;
13 }
14 void dfs(int pos)
15 {
16     int i;
17     id[pos]=low[pos]=dfn++;
18     stack[top++]=pos;
19     for(i=1;i<=n;i++)
20       if(map[pos][i])
21       {
22         if(id[i]==-1)
23            dfs(i);
24         low[pos]=min(low[pos],low[i]);
25       }
26     if(low[pos]>=id[pos])
27     {
28        do
29        {
30           con[stack[--top]]=cn;
31           low[stack[top]]=n;
32        }while(stack[top]!=pos);
33        cn++;
34     }
35 }
36 int main()
37 {
38   //  freopen("bottom.in","r",stdin);
39   //  freopen("ans.txt","w",stdout);
40     while(1)
41     {
42        int i,j;
43        scanf("%d",&n);
44        if(!n) break;
45        scanf("%d",&m);
46        memset(map,0,sizeof(map));
47        while(m--)
48        {
49           int t1,t2;
50           scanf("%d%d",&t1,&t2);
51           map[t1][t2]=1;
52        }
53        dfn=cn=top=rc=0;
54        memset(id,-1,sizeof(id));
55        for(i=1;i<=n;i++)
56          if(id[i]==-1)
57            dfs(i);
58        memset(count,1,sizeof(count));
59        for(i=1;i<=n;i++)
60         if(count[con[i]])
61          for(j=1;j<=n;j++)
62            if(map[i][j]&&con[i]!=con[j])
63            {
64               count[con[i]]=0;
65            }
66        for(i=0;i<cn;i++)
67          if(count[i])
68            {
69              for(j=1;j<=n;j++)
70                if(con[j]==i)
71                   res[rc++]=j;
72            }
73        qsort(res,rc,sizeof(int),cmp);
74        if(rc==0)
75          printf("\n");
76        else
77        {
78          printf("%d",res[0]);
79          for(i=1;i<rc;i++)
80            printf(" %d",res[i]);
81          printf("\n");
82        }
83        
84     }
85     return 0;
86 }
87 


posted on 2010-11-07 02:50 yzhw 阅读(151) 评论(0)  编辑 收藏 引用 所属分类: graph


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜