Uva 10305 拓扑排序
题意:
给定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 拓扑排序的更多相关文章
- UVa 10305 (拓扑排序) Ordering Tasks
题意: 经典的拓扑排序.有n个任务,然后某些任务必须安排在某些任务前面完成,输出一种满足要求的序列. 分析: 拓扑排序用离散里面的话来说就是将偏序关系拓展为全序关系.我们将“小于”这种关系看做一条有向 ...
- 【紫书】Ordering Tasks UVA - 10305 拓扑排序:dfs到底再输出。
题意:给你一些任务1~n,给你m个数对(u,v)代表做完u才能做v 让你给出一个做完这些任务的合理顺序. 题解:拓扑排序版题 dfs到底再压入栈. #define _CRT_SECURE_NO_WAR ...
- uva 10305 拓扑排序裸题
https://vjudge.net/problem/UVA-10305 目前没学dfs做法,用的队列做法,每次找到一个入度为零的点出队后更新其他点,再加入入度为零的点直到查找完毕,这个题目显然一定有 ...
- uva 1423 拓扑排序
刘书上例题 拓扑排序 #include <cstdio> #include <cstdlib> #include <cmath> #include <map ...
- UVa 1572 (拓扑排序) Self-Assembly
题意: 有n种正放形,每种正方形的数量可视为无限多.已知边与边之间的结合规则,而且正方形可以任意旋转和反转,问这n中正方形是否可以拼成无限大的图案. 分析: 首先因为可以旋转和反转,所以可以保证在拼接 ...
- UVA.10305 Ordering Tasks (拓扑排序)
UVA.10305 Ordering Tasks 题意分析 详解请移步 算法学习 拓扑排序(TopSort) 拓扑排序的裸题 基本方法是,indegree表示入度表,vector存后继节点.在tops ...
- Ordering Tasks UVA - 10305 图的拓扑排序
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现
今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...
- [拓扑排序]Ordering Tasks UVA - 10305
拓扑排序模版题型: John has n tasks to do.Unfortunately, the tasks are not independent and the execution of o ...
随机推荐
- SpringMVC之HttpMessageConverter
http://blog.csdn.net/zmx729618/article/details/53034420 HttpMessageConverter接口: T read(Class<? ex ...
- SQL 初级教程学习(六)
1.创建视图 CREATE VIEW [Current Product List] ASSELECT ProductID,ProductNameFROM ProductsWHERE Discontin ...
- 2-SAT问题(白书)
1. 定义 给定一个布尔方程,判断是否存在一组布尔变量的真值指派使整个方程为真的问题,被称为布尔方程的可满足性问题(SAT).SAT问题是NP完全的,但对于满足一定限制条件的SAT问题,还是能够有效求 ...
- Tcpdump的用法
见 超级详细Tcpdump 的用法 http://www.itshouce.com.cn/linux/linux-tcpdump.html
- jquery判断checkbox最多选几个
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- ASP.NET MVC+Bootstrap个人博客之修复UEditor编辑时Bug(四)
我的个人博客站在使用百度富文本编辑器UEditor修改文章时,遇到了一些问题,(不知是bug,还是我没有配置好).但总算找到了解决方法,在此记录下来. 遇到的问题: 正常来讲,进入文章修改页,只需将U ...
- [转]Getting Started with ASP.NET Web API 2 (C#)
http://www.asp.net/web-api 本文转自:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web- ...
- Angular 组件之间的传值
第一种方法(传单个或者多个参数): 主页面方法: 先添加引用:private _routes: Router, Details(PBSCode) { this._routes.navigate(['p ...
- Android基础夯实--重温动画(三)之初识Property Animation
每个人都有一定的理想,这种理想决定着他的努力和判断的方向.就在这个意义上,我从来不把安逸和快乐看作生活目的的本身--这种伦理基础,我叫它猪栏的理想.--爱因斯坦 一.摘要 Property Anima ...
- CCF|打酱油|Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...