【算法练习】数据结构/图论 poj4084:拓扑排序

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_40760678/article/details/100183892