Uva 10305 给任务排序

题目链接:https://uva.onlinejudge.org/external/103/10305.pdf

紫书P167

拓扑排序。

dfs——从一个点出发,dfs 与之相连的所有点,把本身放入到拓扑排序的首部。

#include <bits/stdc++.h>
using namespace std;

const int Maxn = 1000;
int G[Maxn][Maxn];
int topo[Maxn];
int c[Maxn];

int n,m,t;

bool dfs(int u) {
    c[u] = -1;
    for(int v=0;v<n;v++) if(G[u][v]) {
        if(c[v]<0) return false;
        else if(!c[v]&&!dfs(v)) return false;
    }
    c[u] = 1;
    topo[--t] = u;
    return true;
}

bool toposort() {
    t = n;
    memset(c,0,sizeof(c));
    for(int u=0;u<n;u++) if(!c[u]) {
        if(!dfs(u)) return false;
    }
    return true;
}

int main()
{
    while(scanf("%d%d",&n,&m)==2&&n) {
        memset(G,0,sizeof(G));
        for(int i=0;i<m;i++) {
            int u,v;
            scanf("%d%d",&u,&v);
            u--;
            v--;
            G[u][v] = 1;
        }
        if(toposort()) {
            for(int i=0;i<n-1;i++) {
                printf("%d ",topo[i]+1);
            }
            printf("%d\n",topo[n-1]+1);
        }
        else printf("No\n");
    }

    return 0;
}

找入度为 0 的点,在这里开始删边。

#include <bits/stdc++.h>
using namespace std;

const int Maxn = 1100;

int G[Maxn][Maxn];
int degree[Maxn];
int ans[Maxn];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m),n) {
        memset(degree,0,sizeof(degree));
        memset(G,0,sizeof(G));

        for(int i=0;i<m;i++) {
            int u,v;
            scanf("%d%d",&u,&v);
            u--;
            v--;
            G[u][v] = 1;
            degree[v] ++;
        }

        int pos = 0;
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                if(degree[j]==0) {
                    ans[pos++] = j;
                    degree[j] = -1;
                    for(int k=0;k<n;k++) {
                        if(G[j][k]==1)
                            degree[k]--;
                    }
                }
            }
        }

        if(pos==n) {
            for(int i=0;i<n-1;i++)
                printf("%d ",ans[i]+1);
            printf("%d\n",ans[n-1]+1);
        }
        else puts("No");

    }

    return 0;
}

时间: 2024-08-10 17:20:31

Uva 10305 给任务排序的相关文章

UVA - 10305 - Ordering Tasks (拓扑排序!)

UVA - 10305 Ordering Tasks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem F Ordering Tasks Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n task

Ordering Tasks From:UVA, 10305(拓扑排序)

Ordering Tasks From:UVA, 10305 Submit Time Limit: 3000 MS      Special Judge 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 inpu

UVa 10305 - Ordering Tasks 拓扑排序题解

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

Uva 10305 Ordering Tasks(拓扑排序模版题)

Uva 10305 #include<iostream> #include<queue> #define pb push_back #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double pi=acos(-1.0); const int N=1e2+5; using namespace std; int n,m; int du[N]; vector<int>

[2016-02-17][UVA][10305][Ordering Tasks]

时间:2016-02-17 20:18:58 星期三 题目编号:UVA 10305 题目大意:给定n个任务,和m行信息,每行信息包括 i j,表示第i个任务,必须在第j个任务之前完成,输出,任意一个,任务完成的顺序 分析:相当于,给定若个a,b的大小关系,求所有数字可能的大小关系, 方法:拓扑排序   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

uva 10305 Ordering Tasks (简单拓扑)

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.

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)

[拓扑排序]Ordering Tasks UVA - 10305

拓扑排序模版题型: 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 be

UVA 10305 Ordering Tasks (拓扑排序)

题意:给你n个点.m个关系,每个关系两个点u.v,表示u小于v,叫你输出任意一个序列保证满足所有给定的关系 例如:n=3 m=2 1 2 3 1 3 2 3 1 2 题解:拓扑排序排的是一个有向无环图(DAG),首先没有回路,否则会失败,其次如果存在G(u,v),则在该序列中u在v前面 实现方法就是遍历每个点,当此点没被标记过就进入递归 然后将此点看做树的根节点(DAG其实可以看做森林),遍历它可以到的所有点,最后从后向前将点加入排序的序列并标记 #include<cstdio> #inclu