The Bottom of a Graph poj 2553 缩点+Tarjan
2014-03-04 22:13
549 查看
The Bottom of a Graph
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.
Then G=(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+1 is 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
Sample Output
Source
Ulm Local 2003
这个题目是很棒的,主要的部分在于. 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. 题目是找sink,通过题意可以知道就是找强联通变量,找出出度为0的点,然后输出来,直接套Tarjan的模板,稍微改一下就行,比较水的
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 8386 | Accepted: 3460 |
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.
Then G=(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+1 is 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 3 1 3 2 3 3 1 2 1 1 2 0
Sample Output
1 3 2
Source
Ulm Local 2003
这个题目是很棒的,主要的部分在于. 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. 题目是找sink,通过题意可以知道就是找强联通变量,找出出度为0的点,然后输出来,直接套Tarjan的模板,稍微改一下就行,比较水的
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define M 50010 #define N 20010 struct node { int v,next; } unit[M]; int first ,stack ,DFN ,Low ,B ; int instack ; int in ,out ; int n,m,c,sc,top,num; void init() { c=0; sc=top=num=0; memset(first,-1,sizeof(first)); memset(B,0,sizeof(B)); memset(DFN,0,sizeof(DFN)); memset(out,0,sizeof(out)); memset(in,0,sizeof(in)); } int min(int a, int b) { return a < b ? a : b; } int max(int a, int b) { return a > b ? a : b; } void add(int a,int b) { unit[num].v=b; unit[num].next=first[a]; first[a]=num++; } void Tarjan(int v) { int min,t,e,j; DFN[v]=Low[v]=++num; instack[v]=1; stack[top++]=v; for(e=first[v]; e!=-1; e=unit[e].next) { j=unit[e].v; if(!DFN[j]) { Tarjan(j); if(Low[v]>Low[j]) { Low[v]=Low[j]; } } else if(instack[j]&&DFN[j]<Low[v]) { Low[v]=DFN[j]; } } if(DFN[v]==Low[v]) { while(v!=stack[top]) { B[stack[top-1]]=sc; instack[stack[top-1]]=0; top--; } sc++; } } void solve() { int i; for(i=1; i<=n; i++) { if(!DFN[i]) { Tarjan(i); } } } int main() { while(scanf("%d",&n)!=EOF) { if(n==0) break; init(); scanf("%d",&m); int i,j,a,b; for(i=0;i<m;i++) { scanf("%d%d",&a,&b); add(a,b); } //printf("fdhskfjhdskfjfdsfsd"); for(int i=1;i<=n;i++) if(!DFN[i]) Tarjan(i); for(int i=1; i<=n; i++) { for(int end=first[i]; end!=-1; end=unit[end].next) { if(B[i]!=B[unit[end].v]) { //in[B[unit[end].v]]++; // printf("aaaaaaaaa"); out[B[i]]++; } } } int maxin=0,maxout=0; // printf("ccc %d\n",sc); /* for(i=0;i<sc;i++) { printf("%d %d\n",in[i],out[i]); }*/ int flag=1; //printf("fdsjl"); for(i=1;i<=n;i++) { if(!out[B[i]]) { if(flag) { printf("%d",i); flag=0; } else printf(" %d",i); } } printf("\n"); } return 0; }
相关文章推荐
- POJ 2553 - The Bottom of a Graph(Tarjan + 缩点 + 计算出度)
- POJ 2553 The Bottom of a Graph【Tarjan+缩点染色】
- poj 2553 The Bottom of a Graph(Tarjan~)
- POJ 2553 The Bottom of a Graph 缩点之后求出度为0的强联通分量的元素
- [tarjan] poj 2553 The Bottom of a Graph
- pku 2553 The Bottom of a Graph(tarjan缩点)
- POJ 2553 The Bottom of a Graph 【scc tarjan】
- POJ 2553 The Bottom of a Graph(Tarjan)
- POJ2553 The Bottom of a Graph 强连通 tarjan
- POJ2553 The Bottom of a Graph Tarjan 矩阵 pascal 解题报告
- poj 2553 The Bottom of a Graph 【有向图tarjan 求SCC 处理出度为0的SCC】
- [poj 2553]The Bottom of a Graph[Tarjan强连通分量]
- POJ2553 The Bottom of a Graph 强连通 tarjan
- poj 2553 zoj 1979 The Bottom of a Graph(强联通分量 Tarjan)
- poj 2553 The Bottom of a Graph(强连通 Tarjan)
- poj 2553 The Bottom of a Graph(强连通、缩点、出入度)
- POJ-2553 The Bottom of a Graph (强连通分量[Tarjan])
- poj 2553 The Bottom of a Graph 【有向图tarjan 求SCC 处理出度为0的SCC】
- POJ 2553 The Bottom of a Graph TarJan算法题解
- POJ 2553 - The Bottom of a Graph(强连通分量, 缩点)