POJ 2367 Genealogical tree【拓扑排序】
2024-09-07 16:02:23
题意:大概意思是--有一个家族聚集在一起,现在由家族里面的人讲话,辈分高的人先讲话。现在给出n,然后再给出n行数 第i行输入的数表示的意思是第i行的子孙是哪些数,然后这些数排在i的后面。
比如样例 5
0
4 5 1 0
1 0
5 3 0
3 0
1后面没有数
2后面有4 5 1
3后面有1
4后面有5 3
5后面有3
拓扑排序的一点小体会
(1)先把图储存下来,然后储存相应顶点的度数
(2)在图中选择没有前驱的点(即入度为0的点),加入队列中
(3)将以这一点为起点的边删去(将这一点指向的点的入度减1)
(4)重复上面的操作,直到没有入度为0的点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int iq,n;
int queue[1000],map[1000][1000],indegree[1000]; void toposort()
{
int i,j,k;
iq=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(map[i][j])
indegree[j]++;
}
} for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(indegree[j]==0)
{
queue[iq++]=j;
break;
}
}
indegree[j]=-1;//把这一点加进去以后,将这一点的入度记为-1,以免下次又将它加进队列
for(k=1;k<=n;k++)
{
if(map[j][k])
indegree[k]--;
}
}
} int main()
{
int i,v;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
while(scanf("%d",&v)!=EOF&&v)
map[i][v]=1;
}
toposort();
for(i=0;i<iq-1;i++)
printf("%d ",queue[i]);
printf("%d",queue[i]);
}
拓扑排序的第一题--@_@
go--go
最新文章
- Sublime Text 配置代码
- Java 8函数编程轻松入门
- 边工作边刷题:70天一遍leetcode: day 84-3
- JAVA程序的创建与编辑
- 【NOIP2013】【P1441】花匠
- lightoj 1015
- FragmentStatePagerAdapter.notifyDataSetChanged不刷新页面的解决的方法
- jdk-动态代理
- NHibernate之映射文件配置说明(转载3)
- js如何获取object类型里的键值
- Windows7搭建Wamp环境
- 五、Java多人博客系统-2.0版本-数据库设计
- 转:VB.NET Office操作之Word
- mysql表管理
- Xamarin.Android Timer使用方法
- vuejs之v-if-ajax异步请求数据遇到的坑
- 131、ThreadLocal (转载)
- 安装 nginx
- openstack(Pike 版)集群部署(七)--- Cinder 部署
- 比较undefined和“undefined”