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 ...
随机推荐
- Android属性动画ObjectAnimator的使用1
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/106 属性动画ObjectAnimator的使用 属性动画 ...
- 【原创】《从0开始学Elasticsearch》—初识Elasticsearch
目录 1. Elasticsearch 是什么2. Elasticsearch 中基本概念3. Elasticsearch 安装4. 访问 Elasticsearch 1. Elasticsearch ...
- django urls路由匹配分发
django urls路由匹配分发 一.urls配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对 ...
- 动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏
题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第 ...
- 转 SQL*PLUS中的替换变量(& &&)
今天oracle support提供一个脚本,大致如下: PROMPT ROUTING_SEQUENCE_ID = &ROUT_SEQ_ID PROMPT OPERATION_SEQUENCE ...
- Nuget 自定义配置(官网)
<?xml version="1.0" encoding="utf-8"?> <configuration> <config> ...
- 解决asp.net 以及MVC中上传文件大小限制的问题
﹤system.web﹥ ﹤httpruntime requestlengthdiskthreshold="256" maxrequestlength="2097151& ...
- 在阿里云上搭建nginx + ThinkPHP 的实践
作为一个程序猿,理应用linux系统来作为平时的工作机环境,哎,之前倒是用过一段时间的linux,可惜后来换了本本,后来竟然没有保持,嗷嗷后悔中... 废话不多说,大家用windows的理由都一样,但 ...
- Android 中保存数据到文件中
1.在安卓开发中,会遇到保存数据到手机中以及从手机中获取数据的情况 /** * 把数据存放到手机内存中 * * @param number * @param password * @return */ ...
- File文件存储
文件存储的核心是Context提供了一个openFileOutput()与openFileInput()俩个方法 课程demo public class MainActivity extends Ap ...