UVA10305 Ordering Tasks (拓扑序列)

题意:

假设有N个变量,还有M个二元组(u, v),分别表示变量u 小于 v。那么。所有变量从小到大排列起来应该是什么样子的呢?例如,有四个变量a,b,c,d,若a < b, c < b, d < c, 则这四个变量的排序可能是a < d < c < b;尽管还有其他可能,你只需要找出其中一个即可。

思路:

把每个变量看成一个点,“小于”看成一个边,则得到一个有向图。这样,实际任务就是把一个图的所有节点排序,使得对应的每一条有向边(u, v),对应的u都排在v前面,即就是拓扑排序。

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;  

const int maxV = 100;
int head[maxV + 7];
int n, m;
queue<int> ansQu;

struct EdgeNode{
    int to;
    int next;
}Edges[maxV * maxV + 7];

int indegree[maxV];

void getIdg()//获得入度
{
    memset(indegree, 0, sizeof(indegree));
    for(int i = 1; i <= m; i++)
        indegree[ Edges[i].to ]++;
}

void tplgSort()//拓扑排序
{
    getIdg();
    stack<int> tpst;
    for(int i = 1; i <= n; i++)
        if(!indegree[i]) tpst.push(i);
    while(!tpst.empty())
    {
        int v = tpst.top();
        ansQu.push(v);
        tpst.pop();
        for(int j = head[v]; j != -1; j = Edges[j].next)
            if(!(--indegree[ Edges[j].to ]))
                tpst.push(Edges[j].to);
    }
}

int main()
{
    while(~scanf("%d%d", &n ,&m) && (n || m))
    {
        memset(head, -1, sizeof(head));
        memset(&Edges, 0, sizeof(EdgeNode));
        for(int i = 1; i <= m; i++)
        {
            int u, v;
            scanf("%d%d",&u, &v);
            Edges[i].to = v;
            Edges[i].next = head[u];
            head[u] = i;
        }
        tplgSort();
        int flag = 0;
        while(!ansQu.empty())
        {
            printf(flag++ ? " %d":"%d", ansQu.front());
            ansQu.pop();
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-11-05 19:36:18

UVA10305 Ordering Tasks (拓扑序列)的相关文章

UVa10305 Ordering Tasks (拓扑排序)

链接:http://acm.hust.edu.cn/vjudge/problem/19494分析: 题目中n个变量看成图中n个结点,图中的边即是二元关系,m个二元组就代表了这m条边表示的二元关系,(u,v)表示v大于u,从u向v连一条有向边,如果这m个二元组不矛盾,那么这个图便是一个DAG否则就存在一个有向环,解便不存在了,举个栗子a<b,b<c,可以推出a<c,但是现在出现了c连到了a意思是a>c,与之前的递推相悖,所以如果图中存在有向环,则不存在拓扑序,反之一个DAG图就存在拓

UVa 10305 - Ordering Tasks 拓扑排序题解

Topological Sort题解.本题是简单的入门题目. Topological Sort的思想很简单,就是按没有入度的点,先输出,然后删除这个点的出度.然后输出下一组没有入度的点. 如何实现也是很简单的: 这里使用邻接表,建图的时候反过来建图,建立一个入度邻接表. 然后使用一个vis数组,记录访问过的节点,也可以根据这个信息知道哪些是已经输出的点,这个时候这些点的入度可以不算为当前入度了. #include <stdio.h> #include <vector> using

UVA10305 Ordering Tasks【DFS】【拓扑排序】

Ordering Tasks Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been

拓扑排序(Topological Order)UVa10305 Ordering Tasks

2016/5/19 17:39:07 拓扑排序,是对有向无环图(Directed Acylic Graph , DAG )进行的一种操作,这种操作是将DAG中的所有顶点排成一个线性序列,使得图中的任意一对顶点u,v满足如下条件: 若边(u,v)∈E(G),则在最终的线性序列中出现在v的前面 好了,说人话:拓扑排序的应用常常和AOV网相联系,在一个大型的工程中,某些项目不是独立于其他项目的,这意味着这种非独立的项目的完成必须依赖与其它项目的完成而完成,不妨记为u,v,则若边(u,v)∈E(G),代

UVA10305 Ordering Tasks(有向无环图排序--toposort) Kahn算法

题目描述:https://vjudge.net/problem/UVA-10305 题目分析: 恨水的题目,只要学了toposort就会做的,大概意思是给你n个变量,m个不等关系表示a<b,问n个数可能的关系;不如举个例子例如n=3表示3个变量我们假如他们是a,b,c现在有两个关系a<b,a<c 那么输出有两种a<b<c或者a<c<b(题目要求输出任意一种); 题目大概就这个意思,那么我们怎么做呢,我们想一想如果把变量看成点,关系看成有向边,那么就得到一个图,这个

Ordering Tasks 拓扑排序

John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task isonly possible if other tasks have already been executed.InputThe input will consist of several instances of the problem. Each instance begins with a

UVa 10305 - Ordering Tasks (拓扑排序裸题)

John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been executed. Input The input will consist of several instances of the problem. Each instance begins with

uva 10305 Ordering Tasks(拓扑排序)

拓扑排序,不用判断是否有环,dfs挺简单的 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> int map[105][105]; int visit[105]; int c[105]; int n,m,t; void dfs(int x) { visit[x] = 1; for(int i=1; i<=n; i++) { if(!visit[i]&&map[i][x]==1)

UVA10305 Ordering Tasks

一个很裸的拓扑排序题目,只是因为很久没有复习toposort,所以拿来复习一下,最近几天要把图论的经典算法都复习一遍. #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <queue> #include <algorithm> #include <cmath>