UVA 10305 拓扑排序

147 阅读2分钟

UVA 10305 给任务排序

洛谷地址

  1. 思路

    刚看到的时候,第一想法是:我之前是不是做过这个,翻了翻之前的文章,确实有个拓扑排序的,不过之前用的是dp的办法,参见 杂物 , 这次看了看,没法再用dp了,老老实实的用拓扑排序把....

    对拓扑排序的理解参考了 38图的拓扑排序问题及算法讲解

  2. 知识点

    是的,我也是第一次看

    1. 名词
      1. AOV网:顶点表示活动,用有向边表示活动之间的优先关系的有向图
        1. 不允许出现环
        2. 若<vi,ji>是途中的有向边,则vi是ji的直接前驱,ji是vi的直接后继
      2. 拓扑排序:将AOV网中所有顶点按照优先级关系排成一个线性序列dd额过程
      3. 拓扑排序所得到的序列
    2. 排序方法:重点
      1. 再有向图中选一个没有入度(直接前驱)的顶点输出
      2. 从图中删除该顶点和和这个顶点有关的所有弧
      3. 重复以上步骤,直到所有顶点已经输出或者不存在无前驱的结点为止(出现环了)

注水代码:

ps:这次代码没经过检测,也没判环,应该是无法ac的

#include<iostream>
#include<vector>
#include<queue>

using namespace std;

vector<int> vs[105];
int n,m,u,v,topo[105],t;

void init(){
    for(int i=0;i<=100;i++){
        vs[i].clear();
        topo[i] = 0;
    }
}

void bfs(){
    queue<int> qs;
    for(int i=1;i<=n;i++)
        if(topo[i]==0)qs.push(i);

    while(!qs.empty()){

        t = qs.front();
        qs.pop();
        for(int i=0;i<vs[t].size();i++){
            if(--topo[vs[t][i]]==0)qs.push(vs[t][i]);
        }
        cout<<t<<" ";
    }
}

int main(){
    freopen("data.in","r",stdin);
    while(cin>>n>>m&&n){
        init();
        for(int i=0;i<m;i++){
            cin>>u>>v;
            vs[u].push_back(v);
            topo[v]++;
        }
        bfs();
    }
    return 0;
}