首页 > 代码库 > POJ——T2553 The Bottom of a Graph
POJ——T2553 The Bottom of a Graph
http://poj.org/problem?id=2553
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 10987 | Accepted: 4516 |
Description
We will use the following (standard) definitions from graph theory. Let V be a nonempty and finite set, its elements being called vertices (or nodes). Let E be a subset of the Cartesian product V×V, its elements being called edges. ThenG=(V,E) is called a directed graph.
Let n be a positive integer, and let p=(e1,...,en) be a sequence of length n of edges ei∈E such that ei=(vi,vi+1) for a sequence of vertices (v1,...,vn+1). Then p is called a path from vertex v1 to vertex vn+1 in G and we say that vn+1is reachable from v1, writing (v1→vn+1).
Here are some new definitions. A node v in a graph G=(V,E) is called a sink, if for every node w in G that is reachable from v, v is also reachable from w. The bottom of a graph is the subset of all nodes that are sinks, i.e.,bottom(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}. You have to calculate the bottom of certain graphs.
Let n be a positive integer, and let p=(e1,...,en) be a sequence of length n of edges ei∈E such that ei=(vi,vi+1) for a sequence of vertices (v1,...,vn+1). Then p is called a path from vertex v1 to vertex vn+1 in G and we say that vn+1is reachable from v1, writing (v1→vn+1).
Here are some new definitions. A node v in a graph G=(V,E) is called a sink, if for every node w in G that is reachable from v, v is also reachable from w. The bottom of a graph is the subset of all nodes that are sinks, i.e.,bottom(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}. You have to calculate the bottom of certain graphs.
Input
The input contains several test cases, each of which corresponds to a directed graph G. Each test case starts with an integer number v, denoting the number of vertices of G=(V,E), where the vertices will be identified by the integer numbers in the set V={1,...,v}. You may assume that 1<=v<=5000. That is followed by a non-negative integer e and, thereafter, e pairs of vertex identifiers v1,w1,...,ve,we with the meaning that (vi,wi)∈E. There are no edges other than specified by these pairs. The last test case is followed by a zero.
Output
For each test case output the bottom of the specified graph on a single line. To this end, print the numbers of all nodes that are sinks in sorted order separated by a single space character. If the bottom is empty, print an empty line.
Sample Input
3 31 3 2 3 3 12 11 20
Sample Output
1 32
Source
Ulm Local 2003
模板题,调了三天(崩溃)很无奈
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int MAXN(500010); 8 const int N(5010); 9 int n,m,u,v;10 int sumedge,head[N];11 struct Edge12 {13 int to,next;14 Edge(int to=0,int next=0) :15 to(to),next(next) {}16 }edge[MAXN];17 18 void ins(int from,int to)19 {20 edge[++sumedge]=Edge(to,head[from]);21 head[from]=sumedge;22 }23 24 int low[N],dfn[N],tim;25 int Stack[N],instack[N],top;26 int sumcol,col[N],point[N];27 28 void DFS(int now)29 {30 low[now]=dfn[now]=++tim;31 Stack[++top]=now; instack[now]=true;32 for(int i=head[now];i;i=edge[i].next)33 {34 int go=edge[i].to;35 if(!dfn[go])36 DFS(go),low[now]=min(low[now],low[go]);37 else if(instack[go]) low[now]=min(low[now],dfn[go]);38 }39 if(low[now]==dfn[now])40 {41 col[now]=++sumcol;42 for(;Stack[top]!=now;top--)43 {44 col[Stack[top]]=sumcol;45 instack[Stack[top]]=false;46 }47 instack[now]=false; top--;48 }49 }50 51 int cnt,ans[N],chudu[N];52 53 void init()54 {55 tim=top=cnt=0;56 sumcol=sumedge=0;57 memset(ans,0,sizeof(ans));58 memset(low,0,sizeof(low));59 memset(dfn,0,sizeof(dfn));60 memset(col,0,sizeof(col)); 61 memset(head,0,sizeof(head)); 62 memset(chudu,0,sizeof(chudu));63 memset(Stack,0,sizeof(Stack)); 64 memset(instack,0,sizeof(instack));65 }66 67 int main()68 {69 /*freopen("made.txt","r",stdin);70 freopen("myout.txt","w",stdout);*/71 72 while(~scanf("%d",&n)&&n)73 {74 scanf("%d",&m); init();75 for(;m;m--)76 scanf("%d%d",&u,&v),ins(u,v); 77 for(int i=1;i<=n;i++)78 if(!dfn[i]) DFS(i);79 for(u=1;u<=n;u++)80 for(v=head[u];v;v=edge[v].next)81 if(col[u]!=col[edge[v].to]) chudu[col[u]]++;82 /*for(int sc=1;sc<=sumcol;sc++)83 if(!chudu[sc])84 for(int i=1;i<=n;i++)85 if(sc==col[i]) ans[++cnt]=i;*/86 for(int i=1;i<=n;i++)87 if(!chudu[col[i]]) ans[++cnt]=i;88 sort(ans+1,ans+cnt+1);89 if(cnt) 90 {91 for(int i=1;i<cnt;i++) printf("%d ",ans[i]);92 printf("%d\n",ans[cnt]);93 }94 else printf("\n");95 }96 return 0;97 }
POJ——T2553 The Bottom of a Graph
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。