题型:图论
题意:
输入一个n,表示中有n个顶点,接下来n行, 每行输入几个数字,第i行的数字表示它们是顶点i的后继节点,当数字为0时,表示i点没有后继节点了。 就是要求输出这个有向图的拓扑序列。
分析:由于题目保证有解,所以剩下的就是基本的拓扑排序了。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int head[1000],nc,indegree[1000],n;
struct Edge{
int to,next;
}edge[1000];
void add(int a,int b){
edge[nc].to=b;
edge[nc].next=head[a];
head[a]=nc;
nc++;
}
void Topo(){
int i,k;
int queue[1000];
int iq=0;
for(int i=1;i<=n;i++){
if(indegree[i]==0) queue[iq++]=i;
}
for(i=0;i<iq;i++){
for(k=head[queue[i]];k!=-1;k=edge[k].next){
indegree[edge[k].to]--;
if(indegree[edge[k].to]==0)
queue[iq++]=edge[k].to;
}
}
printf("%d",queue[0]);
for(i=1;i<iq;i++) printf(" %d",queue[i]);
printf("\n");
}
int main(){
int t,j;
while(~scanf("%d",&n)){
nc=0;
memset(head,-1,sizeof(head));
memset(indegree,0,sizeof(indegree));
for(int i=1;i<=n;i++){
while(1){
scanf("%d",&j);
if(j==0) break;
add(i,j);
indegree[j]++;
}
}
Topo();
}
return 0;
}