标签:
Genealogical tree2 4 5 3 1
题解:
输入N m
5 ————N
0 i=1,与m的关系,m为0时表示没有关系
4 5 1 0 i=2
1 0
5 3 0
3 0
最终输出关系顺序(拓扑排序)
简单的拓扑排序输出顺序即可
一个标准的拓扑排序题解。代码:
#include<cstdio>
#include<cstring>
#include<queue>
#define N 110
using namespace std;
int n;
int relate[N][N];
int indegree[N];///记录入度
int res[N];
///拓扑排序的核心
void topo_sort()
{
int i,j;
int flag=1;
for(j=1;j<=n;++j)
{
int temp=-1;
for(i=1;i<=n;++i)
{
if(indegree[i]==0)
{
temp=i;
break;
}
}
indegree[temp]=-1;
flag?printf("%d",temp):printf(" %d",temp);
flag=0;
for(i=1;i<=n;++i)
{
if(relate[temp][i])
{
indegree[i]--;
}
}
}
printf("\n");
}
int main()
{
int tmp,m;
int i,j;
while(~scanf("%d",&n))
{
memset(indegree,0,sizeof(indegree));
memset(relate,0,sizeof(relate));
for(i=1;i<=n;++i)
{
while(~scanf("%d",&m),m)
{
relate[i][m]=1;
indegree[m]++;
}
}
topo_sort();
}
return 0;
}
代码2:
邻接表形式:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
struct note
{
int to;
int next ;
};
note edge[10004];
int head[10005],ip,iq,indegree[10005],que[10005];
///邻接表的建立
void add(int u,int v)
{
edge[ip].to=v;
edge[ip].next=head[u];
head[u]=ip++;
}
int main()
{
int n,m;
while(~scanf("%d",&n))
{
memset(head,-1,sizeof(head));
memset(que,0,sizeof(que));
memset(indegree,0,sizeof(indegree));
ip=iq=0;
for(int i=1; i<=n; i++)
{
while(1)
{
scanf("%d",&m);
if(m==0)
break;
add(i,m);///邻接表
indegree[m]++;
}
}
for(int i=1; i<=n; i++)
{
if(indegree[i]==0)
que[iq++]=i;
}
for(int i=0; i<iq; i++)
{
for(int k=head[que[i]]; k!=-1; k=edge[k].next)
{
if(--indegree[edge[k].to]==0)
que[iq++]=edge[k].to;
}
}
for(int i=0; i<n; i++)
printf(i==n-1?"%d\n":"%d ",que[i]);
}
return 0;
}
POJ 2367 Genealogical tree (拓扑排序)
标签:
原文地址:http://blog.csdn.net/jingttkx/article/details/51360958