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 ...
随机推荐
- Python圈中的符号计算库-Sympy(转载)
<本文来自公众号“大邓带你玩python”,转载> import math math.sqrt(8) 2.8284271247461903 我们看看Python中结果 math.sqrt( ...
- mysql创建数据库在硬盘位置 for Mac
使用HomeBrew安装为/usr/local/var/mysql 使用官方下载的dmg镜像安装为/usr/local/mysql
- IOS编译报错:objc-class-ref in AppDelegate.o之解决方案 Xcode7
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_QQApiInterface", referenced from ...
- AJPFX总结mysql复制表结构,表数据
1.复制表结构及数据到新表CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable; ...
- (五)Mybatis总结之一对多、一对一
一对多 业务场景:张三既是java开发师又是大学老师又是LOL代练,张三拥有多个角色. 1.创建实体类UserInfo和RoleInfo package com.qf.mybatisdemo.pojo ...
- 重写java.lang.String IndexOf()方法,实现对字符串以ASCII规则截取
/** * 根据元数据和目标ascii位数截取字符串,失败返回-1 * @param sourceStr 元数据字符串 * @param endIndex 截取到第几位 * @return 结果字符串 ...
- springmvc 的配置 annotation-config/annotation-drive/ component-scan 区别
1. <context:annotation-config /> 作用隐式的配置注解的加载类,默认的加载了AutowiredAnnotationBeanPostProcessor(auto ...
- 计算机网络、OSI模型、TCP/IP族
一.计算机网络分类 1.按通信距离分类: 局域网:LAN,10m-1000m,房间.校园: 城域网:MAN,10km,城市: 广域网:WAN,100km以上,国家.全球. 二.OSI(Open Sys ...
- iTOP-4412开发板网盘资料介绍
iTOP-4412开发板网盘视频资料内容如下: 01-烧写.编译以及基础知识视频 02-嵌入式Linux 视频 03-iTOP-4412 开发板硬件设计指导视频 04-Android 应用程序视频 0 ...
- Ryubook_1_switch_hub_源码
一.switching hub by openflow: 用Ryu实现一个有如下功能的switching hub. • Learns the MAC address of the host conne ...