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

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

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

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

下面是算法的演示过程。

下面看一道例题

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

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

看代码:

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

Ordering Tasks UVA - 10305(拓扑排序)的更多相关文章

  1. 【紫书】Ordering Tasks UVA - 10305 拓扑排序:dfs到底再输出。

    题意:给你一些任务1~n,给你m个数对(u,v)代表做完u才能做v 让你给出一个做完这些任务的合理顺序. 题解:拓扑排序版题 dfs到底再压入栈. #define _CRT_SECURE_NO_WAR ...

  2. Ordering Tasks UVA - 10305 图的拓扑排序

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  3. [拓扑排序]Ordering Tasks UVA - 10305

    拓扑排序模版题型: John has n tasks to do.Unfortunately, the tasks are not independent and the execution of o ...

  4. UVa 10305 (拓扑排序) Ordering Tasks

    题意: 经典的拓扑排序.有n个任务,然后某些任务必须安排在某些任务前面完成,输出一种满足要求的序列. 分析: 拓扑排序用离散里面的话来说就是将偏序关系拓展为全序关系.我们将“小于”这种关系看做一条有向 ...

  5. Uva 10305 拓扑排序

    题意: 给定n个点,与m条边, 给出他们的拓扑排序. 分析: 拓扑排序可以有两种做法, 第一种是dfs, 每次都找到某一个点的终点, 然后加入序列末尾, 正在访问的标记为-1, 访问过的标记为1, 未 ...

  6. 拓扑排序 (Ordering Tasks UVA - 10305)

    题目描述: 原题:https://vjudge.net/problem/UVA-10305 题目思路: 1.依旧是DFS 2.用邻接矩阵实现图 3.需要判断是否有环 AC代码 #include < ...

  7. uva 10305 拓扑排序裸题

    https://vjudge.net/problem/UVA-10305 目前没学dfs做法,用的队列做法,每次找到一个入度为零的点出队后更新其他点,再加入入度为零的点直到查找完毕,这个题目显然一定有 ...

  8. uva 1423 拓扑排序

    刘书上例题  拓扑排序 #include <cstdio> #include <cstdlib> #include <cmath> #include <map ...

  9. UVa 1572 (拓扑排序) Self-Assembly

    题意: 有n种正放形,每种正方形的数量可视为无限多.已知边与边之间的结合规则,而且正方形可以任意旋转和反转,问这n中正方形是否可以拼成无限大的图案. 分析: 首先因为可以旋转和反转,所以可以保证在拼接 ...

随机推荐

  1. Java Iterable类

    查看java源代码 /* * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE ...

  2. Java的post(HTTPS)请求-----接口测试

    package com.ju.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...

  3. 51nod - 1179 - 最大的最大公约数 - 枚举

    因为 \(\sum\limits_{i=1}^{n}\lfloor\frac{n}{i}\rfloor=O(nlogn)\) 所以直接暴力就可以了. #include<bits/stdc++.h ...

  4. poj1195(二维树状数组)

    题目链接:https://vjudge.net/problem/POJ-1195 题意:有s*s的矩阵,初始化为全0,有两种操作,单点修改(x,y)的值,区间查询(x,y)的值(l<=x< ...

  5. multiset的应用

    multiset 和set差不多 ,但是可以存储多个一样的元素

  6. git 增量打包

    git diff f506693 ccc253c3 --name-only | xargs tar -czvf update.tar.gz

  7. (multi)set的某些操作

    (multi)set的某些操作 我们可以把multiset当作平衡树用~ 注意,必须定义小于运算符. s.begin() 返回指向第一个元素的迭代器. s.end() 返回指向最后元素的后面那个虚拟元 ...

  8. django 基础框架学习 (三)

    Django框架基础-03数据库新增数据    1.save⽅法        >>> from datetime import date        >>> f ...

  9. Task4

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. vue坑

    项目地址:https://pan.baidu.com/s/1c1Dflp2 使用前提:安装nodejs环境,webpack的配置官网的例子跟着跑一遍,会vue开发 研究webpack+vue研究了一个 ...