zoukankan      html  css  js  c++  java
  • Ordering Tasks UVA

    在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。

    先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。

    一直做改操作,直到所有的节点都被分离出来。

    如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。

    下面是算法的演示过程。

    下面看一道例题

    题目链接:https://vjudge.net/problem/UVA-10305

    代码真的很简单 ,完全是水题。

     看代码:

    #include<iostream>
    #include<queue>
    #include<vector>
    #include<string.h>
    using namespace std;
    const int maxn=100+5;
    int N,M;
    int in[maxn];//表示该节点的入度
    int edge[maxn][maxn];//edge[i][j]不为0表示i到j有路
    
    void solve()
    {
        queue<int> q;
        vector<int>ans;
        for(int i=1;i<=N;i++)
        {
            if(in[i]==0) q.push(i);//入度为0的结点入队列
        }
        while(!q.empty())
        {
            int p=q.front();
            q.pop();
            ans.push_back(p);//拿出入度为0的结点
            for(int i=1;i<=N;i++)//与该结点之间有边的入度减1
            {
                if(edge[p][i])
                {
                    edge[p][i]--;
                    in[i]--;
                    if(in[i]==0) q.push(i);//入度减为0  入队列
                }
    
            }
        }
        cout<<ans[0];
        for(int i=1;i<ans.size();i++) cout<<" "<<ans[i];
        cout<<endl;
        return ;
    }
    int main()
    {
    
        int a,b;
        while(cin>>N>>M)
        {
            if(N==0&&M==0) break;
            memset(edge,0,sizeof(edge));
            memset(in,0,sizeof(in));
            for(int i=0;i<M;i++)
            {
                cin>>a>>b;
                in[b]++;
                edge[a][b]++;
            }
            solve();
        }
    
        return 0;
    }



    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    如何在VS2013中进行Boost单元测试
    C++项目中的extern "C" {}(转)
    C/C++语言中NULL、'’和0的区别
    关于C++“加、减机制”的整理
    C++继承中的public/protected/private
    Systemc在VC++2010安装方法及如何在VC++2010运行Noxim模拟器
    Testbench(转)
    Java高级特性之泛型
    Java高级特性之反射
    Java 输入输出流
  • 原文地址:https://www.cnblogs.com/caijiaming/p/10387876.html
Copyright © 2011-2022 走看看