标签:poj
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions: 2738 | Accepted: 1838 | Special Judge | ||
Description
Input
Output
Sample Input
5
0
4 5 1 0
1 0
5 3 0
3 0
Sample Output
2 4 5 3 1
题意:大意就是给你一个N个点的图,并且给你图中的有向边,要你输出一个可行的点拓扑序列即可.输入格式为,第一行点数N,以下接着有N行,每行以0结尾.第i行包含了以i点为起点的有向边所指的所有节点.
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int M = 100 + 50;
int n;
int in[M];
int out[M];
vector<int> map[M];
void toposort()
{
queue<int>Q;
for(int i=1; i<=n; i++)
if( !in[i] ) //未出现的数
Q.push( i );
int cnt = 0;
while( !Q.empty() )
{
int u = Q.front();
//printf( "%d\n", u );
Q.pop();
out[ ++cnt ] = u; //用数组存下结果
for(int i=0; i<map[u].size(); i++) //每行记录的数字分别入队
{
int m = map[u][i];
if( --in[m] == 0 ) //如果这个数出现多次则先不如队
Q.push( m );
}
}
}
int main()
{
while( scanf( "%d", &n )==1 && n )
{
for(int i=1; i<=n; i++)
{
map[i].clear(); //vector数组的初始化
in[i] = 0;
int m;
for( ; ; )
{
scanf( "%d", &m );
if( m==0 )
break;
map[i].push_back( m );
in[m]++;
}
}
toposort();
for(int i=1; i<=n; i++)
{
if( i<n )
printf( "%d ", out[i] );
else
printf( "%d\n", out[i] );
}
}
return 0;
}
POJ 2367:Genealogical tree(拓扑排序),布布扣,bubuko.com
POJ 2367:Genealogical tree(拓扑排序)
标签:poj
原文地址:http://blog.csdn.net/u013487051/article/details/37913587