hdu1285(拓扑排序)
2013-08-02 22:26
190 查看
拓扑排序简单来说就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。
拓扑排序最大的用途就是判断一个有向图是否有环,当然判断还有一种方法就是Floyd算法。
如果用邻接表的话拓扑排序的时间复杂度是O(N*E),邻接矩阵是O(N^2),N表示顶点数,E表示边数,Floyd时间复杂度是O(N^3)。
性质
1、 拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。
2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路
3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序
与一般的拓扑排序比,这个只多了一个存储名次的数组。。
#include<stdio.h>
#include<string.h>
int map[501][501];
int ans[501],degree[501];
int m,n;
void toposort()
{
int i,j,r;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]==1)
degree[j]++;//数组用来记录每个点的入度
for(i=1;i<=n;i++)
{
j=1;
while(degree[j]!=0)//从第一个节点开始找到一个节点入度为0的节点
j++;
ans[i]=j;//储答案
degree[j]--;//将该节点的入度更新为-1
for(r=1;r<=n;r++)
{
if(map[j][r]==1)//将所有与节点j相连的节点的入度值全部减1
degree[r]--;
}
}
}
int main()
{
int i,h,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(degree,0,sizeof(degree));
memset(map,0,sizeof(map));
for(i=0;i<m;i++)
{
scanf("%d%d",&k,&h);
map[k][h]=1;
}
toposort();
for(i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans
);
}
return 0;
}
拓扑排序最大的用途就是判断一个有向图是否有环,当然判断还有一种方法就是Floyd算法。
如果用邻接表的话拓扑排序的时间复杂度是O(N*E),邻接矩阵是O(N^2),N表示顶点数,E表示边数,Floyd时间复杂度是O(N^3)。
性质
1、 拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。
2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路
3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序
与一般的拓扑排序比,这个只多了一个存储名次的数组。。
#include<stdio.h>
#include<string.h>
int map[501][501];
int ans[501],degree[501];
int m,n;
void toposort()
{
int i,j,r;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]==1)
degree[j]++;//数组用来记录每个点的入度
for(i=1;i<=n;i++)
{
j=1;
while(degree[j]!=0)//从第一个节点开始找到一个节点入度为0的节点
j++;
ans[i]=j;//储答案
degree[j]--;//将该节点的入度更新为-1
for(r=1;r<=n;r++)
{
if(map[j][r]==1)//将所有与节点j相连的节点的入度值全部减1
degree[r]--;
}
}
}
int main()
{
int i,h,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(degree,0,sizeof(degree));
memset(map,0,sizeof(map));
for(i=0;i<m;i++)
{
scanf("%d%d",&k,&h);
map[k][h]=1;
}
toposort();
for(i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans
);
}
return 0;
}
相关文章推荐
- hdu1285 确定比赛名次(拓扑排序多种方法)
- hdu1285 确定比赛名次【拓扑排序】
- hdu1285确定比赛名次(字典序最小的拓扑排序)
- hdu1285 确定比赛名次 拓扑排序学习 待补完
- hdu1285 确定比赛名次(拓扑排序)
- HDU1285:确定比赛名次(拓扑排序)
- HDU1285 确定比赛名次(拓扑排序)
- hdu1285(拓扑排序)
- hdu1285【拓扑排序】确定比赛名次
- HDU1285 确定比赛名次 【拓扑排序】
- HDU1285_拓扑排序
- 拓扑排序(hdu1285)
- hdu1285:确定比赛名次(拓扑排序+优先级队列)
- 拓扑排序例题 hdu1285 hdu3342
- HDU1285 拓扑排序
- hdu1285 简单拓扑排序
- hdu1285 拓扑排序 java实现
- hdu1285 确定比赛名次 (拓扑排序)
- HDU1285确定比赛名次(拓扑排序)
- hdu1285确定比赛名次 (拓扑排序)