TopoSort(拓扑排序)
其实说白了,拓扑排序就是一个广度优先搜索。
拓扑排序的方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
本题目是采用的邻接表存储方法。
具体的实现是用vector数组。
题目:HDU 1285 http://acm.hdu.edu.cn/showproblem.php?pid=1285
View Code
#include "iostream" #include "vector" #include "queue" using namespace std; #define MAX 505 int InDeg[MAX]; int n, m, Count; int Ans[MAX]; void TopoSort(vector<int> v[]) { priority_queue<int, vector<int>, greater<int> > PQ; for(int i=1; i<=n; i++) //找出入度为0的点并放入优先队列 if(InDeg[i]==0) PQ.push(i); while(!PQ.empty()) //BFS { int Tmp = PQ.top(); PQ.pop(); Ans[Count++] = Tmp; for(int i=0; i<v[Tmp].size(); i++) { InDeg[v[Tmp][i]]--; if(InDeg[v[Tmp][i]]==0) PQ.push(v[Tmp][i]); } } } int main() { int x, y; while(cin>>n>>m) { vector<int> V[MAX]; memset(Ans, 0, sizeof(Ans)); Count = 0; memset(InDeg, 0, sizeof(InDeg)); for(int i=0; i<m; i++) { cin>>x>>y; InDeg[y]++; V[x].push_back(y); } TopoSort(V); for(int i=0; i<Count-1; i++) cout<<Ans[i]<<" "; cout<<Ans[Count-1]<<endl; } }
posted on 2012-04-11 18:36 More study needed. 阅读(948) 评论(0) 编辑 收藏 举报