HDU1285-拓扑排序
2013-01-18 10:30
218 查看
总算放假了,这学期该死的科目,纠结死了!呵呵!今天开始正式的假期学习!
今天看了一个新的数据结构,拓扑排序!
拓扑排序:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
拓扑排序的实现方法:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
找了个最简单的入门题做了下,算是对拓扑排序有个初步的了解,
原题链接:点击打开链接
下面直接贴出代码:
今天看了一个新的数据结构,拓扑排序!
拓扑排序:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
拓扑排序的实现方法:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
找了个最简单的入门题做了下,算是对拓扑排序有个初步的了解,
原题链接:点击打开链接
下面直接贴出代码:
#include <stdio.h> #include <iostream> #include <algorithm> int a[501][501]; int b[501],w[501]; int n,m,i,j,s,t; using namespace std; int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(w,0,sizeof(w)); for(i=1;i<=m;i++) { cin>>s>>t; if(!a[s][t]) { a[s][t]++; //输入胜负关系,注意重边 b[t]++; } } int numb=0; while(1) { j=1; if(b[j]!=0) //找入度为0的节点 { while(1) { j++; if(b[j]==0) break; if(j>n) break; } } b[j]=-1; //删去该顶点, w[numb]=j; //用一个数组对节点进行存储。 numb++; for(i=1;i<=n;i++) { if(a[j][i]>0) { b[i]--; a[j][i]=-1; //删去从该顶点发出的全部有向边. } } if(numb>n) break; } for(i=0;i<numb-2;i++) //输出节点 cout<<w[i]<<' '; cout<<w[numb-2]<<endl; } return 0; }
相关文章推荐
- 确定比赛名次---HDU1285(拓扑排序)
- [hdu1285]拓扑排序模板 邻接表加优先队列简单易懂
- hdu1285 确定比赛名次 拓扑排序学习 待补完
- hdu1285 确定比赛名次(拓扑排序)
- hdu1285 确定比赛名次(拓扑排序多种方法)
- hdu1285 确定比赛名次【拓扑排序】
- hdu1285确定比赛名次(字典序最小的拓扑排序)
- 拓扑排序(hdu1285)
- hdu1285:确定比赛名次(拓扑排序+优先级队列)
- HDU1285:确定比赛名次(拓扑排序)
- HDU1285 确定比赛名次(拓扑排序)
- hdu1285(拓扑排序)
- hdu1285【拓扑排序】确定比赛名次
- HDU1285 确定比赛名次 【拓扑排序】
- HDU1285_拓扑排序
- HDU1285确定比赛名次(拓扑排序)
- 拓扑排序例题 hdu1285 hdu3342
- HDU1285 拓扑排序
- hdu1285 简单拓扑排序
- hdu1285 拓扑排序 java实现