题意:

给定n个点,与m条边, 给出他们的拓扑排序。

分析:

拓扑排序可以有两种做法, 第一种是dfs, 每次都找到某一个点的终点, 然后加入序列末尾, 正在访问的标记为-1, 访问过的标记为1, 未访问的标记为0

int c[maxn];
vector<int> G[maxn];
stack<int> s;
bool dfs(int u){
c[u] = -;//标记为正在访问
for(int i = ; i < G[i].size(); i++){
int v = G[u][i];
if(c[v] == -) return false;//如果访问到正在访问的点, 说明有环
if(c[v] == ){//如果没访问过
if(!dfs(v)) return false; //访问该点, 如果该点(或该点的孩子)访问到正在访问, 说明有环
}
}
c[u] = ;//标记为以访问
s.push(u);//入栈
return true;
}
void toposort(){
for(int i = ; i <= n; i++)
if(!c[i]){//没访问过
if(!dfs(i)) return false;
}
return true;
}
 #include <bits/stdc++.h>
using namespace std;
int Matrix[][];
int c[];
int n, m, t;
int topo[];
bool dfs(int u){
// printf("%d %d\n", u, c[u]);
c[u] = -;
for(int v = ; v <= n; v++){
if(Matrix[u][v]){
if(c[v] < ) return false;
else if(!c[v] && !dfs(v)) return false;
}
}
topo[--t] = u;
c[u] = ;
return true;
} bool toposort(){
t = n;
for(int i = ; i <= n; i++){
if(!c[i])
if(!dfs(i)) return false;
}
printf("%d",topo[]);
for(int i = ; i < n; i++){
printf(" %d",topo[i]);
}
printf("\n");
}
int main(){
#if LOCAL
freopen("1.txt","r",stdin);
#endif // LOCAL
while(scanf("%d %d", &n, &m)== && n){
memset(Matrix,,sizeof(Matrix));
memset(c,,sizeof(c));
for(int i = ; i < m; i++){
int u , v;
scanf("%d %d", &u, &v);
Matrix[u][v] = ;
}
toposort(); }
return ;
}

dfs

第二种是标记每个点的入度, 每次都将入度为0的加入序列头部, 然后将他的出边的点的入度减去, 循环n次就能找出拓扑排序了。

 #include <bits/stdc++.h>
using namespace std;
int Matrix[][];
int degree[];
int c[];
int n, m, t;
int topo[];
bool dfs(int u){
// printf("%d %d\n", u, c[u]);
c[u] = -;
for(int v = ; v <= n; v++){
if(Matrix[u][v]){
if(c[v] < ) return false;
else if(!c[v] && !dfs(v)) return false;
}
}
topo[--t] = u;
c[u] = ;
return true;
} bool toposort(){
t = n;
// for(int i = 1; i <= n; i++)
// printf("%d ",degree[i]);
// printf("\n");
while(t--){
// for(int i = 1; i <= n; i++)
// printf("%d ",degree[i]);
// printf("\n"); int u;
for(int i = ; i <= n; i++){
if(degree[i] == && c[i] == ){
c[i] = ;
u = i;
break;
}
}
// printf("$$ %d %d\n", u, t);
for(int i = ; i <= n; i++)
if(Matrix[u][i]) degree[i] --;
topo[n-t-] = u;
}
printf("%d",topo[]);
for(int i = ; i < n; i++){
printf(" %d",topo[i]);
}
printf("\n");
}
int main(){
#if LOCAL
freopen("1.txt","r",stdin);
#endif // LOCAL
while(scanf("%d %d", &n, &m)== && n){
memset(Matrix,,sizeof(Matrix));
memset(c,,sizeof(c));
memset(degree,,sizeof(degree));
for(int i = ; i < m; i++){
int u , v;
scanf("%d %d", &u, &v);
Matrix[u][v] = ;
degree[v]++;
}
toposort(); }
return ;
}

度数

Uva 10305 拓扑排序的更多相关文章

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

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

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

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

  3. uva 10305 拓扑排序裸题

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

  4. uva 1423 拓扑排序

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

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

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

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

    UVA.10305 Ordering Tasks 题意分析 详解请移步 算法学习 拓扑排序(TopSort) 拓扑排序的裸题 基本方法是,indegree表示入度表,vector存后继节点.在tops ...

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

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

  8. Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现

    今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...

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

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

随机推荐

  1. Elementui实战知识点随记

    1. Elementui实战知识点随记 1.1. 表单验证 对于复杂数据,类似于对象里面包含数组,每个数组又包含多个对象,表单验证我查看了网上很多资料都说Elementui不支持,实际上,经过我官网的 ...

  2. 题解报告:hdu 5750 Dertouzos(最大真约数、最小素因子)

    Problem Description A positive proper divisor is a positive divisor of a number n, excluding n itsel ...

  3. 树莓派 离线安装 apt-get offline

    有网络的地方 sudo cp /var/cache/apt/archives/YOUR_PACK_NAME ~/swap/deb/ 没网络的地方 sudo dpkg -i ~/swap/deb/*

  4. A8通用权限框架

  5. html5移动端适配- media query

    iPad部分css适配 - media query 代码如下图:   注:  @media要放在css最下方,防止被覆盖.  

  6. Spring && 实验IOC

    一.Spring作用 1.生态体系庞大,全能型选手![springmvc是其一个子模块,jdbcTemplate能直接操作数据库!]    2.将其他组件粘合在一起    3.IOC容器和AOP[As ...

  7. Jauery 中Ajax的几种异步请求

       以下介绍Jquery中  Post   Get   Ajax几种异步请求的使用方法  <%@ Page Language="C#" AutoEventWireup=&q ...

  8. 支付宝SDK

    由于支付宝SDK对于整个支付流程已经介绍的十分详细了,在这里我就简单说一些注意点. 由于存在支付宝可能没有安装的情况,所以我们在调用支付宝支付时,需要对其进行判断,做出不同的处理方式,即是使用客户端支 ...

  9. v使用索引的注意事项及常见场景、案例

    索引的原理与作用,各种书籍和网络上的介绍可以说是铺天盖地,基本上主流数据库系统的也都是一致的.选择索引字段的原则,比如外键字段.数据类型较小的字段.经常用于查询或排序的字段.表关联的字段等等,在此不做 ...

  10. SQL——视图、事务、锁、存储过程

    https://www.bilibili.com/video/av15496406/?p=57 https://blog.csdn.net/u013630349/article/details/750 ...