题目链接:http://bailian.openjudge.cn/practice/4084
4084:拓扑排序
总时间限制:
1000ms
内存限制:
65536kB
描述
给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前。
输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号。
v<=100, a<=500
输出
若干个空格隔开的顶点构成的序列(用小写字母)。
样例输入
6 8 1 2 1 3 1 4 3 2 3 5 4 5 6 4 6 5
样例输出
v1 v3 v2 v6 v4 v5
题目意思:
就是有向图的拓扑排序
维护一个队列保存入度为0的结点,题目又要求说编号小的顶点在前,于是这个队列可以定义成优先队列,也就是最小堆,默认的是最大堆
priority_queue<int,vector<int>,greater<int>> Q;
快乐AC,记住思路,是很简单的模板题:
AC:
//图论 拓扑排序
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
priority_queue<int,vector<int>,greater<int>> Q;
int inDegree[120]; //代表顶点的入度
vector<int> G[120];
int main(){
int v,a;
//初始化
for(int i=0;i<120;i++){
inDegree[i]=0;
G[i].clear(); //清空vector中的元素
}
cin>>v>>a;
int x,y;
for(int i=0;i<a;i++){
cin>>x>>y;
inDegree[y]++;
G[x].push_back(y);
}
for(int i=1;i<=v;i++){
if(inDegree[i]==0)
Q.push(i);
}
while (!Q.empty()){
int cur=Q.top();
Q.pop();
cout<<"v"<<cur<<" ";
for(int i=0;i<G[cur].size();i++){
int u=G[cur][i];
inDegree[u]--;
if(inDegree[u]==0){
Q.push(u);
}
}
}
cout<<endl;
return 0;
}