题意:

给定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. 百度地图API详细介绍

    <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <t ...

  2. Luogu P1113 杂务 【拓扑排序】 By cellur925

    题目传送门 这题我们一看就知道是拓扑排序,然而在如何转化问题上花了大工夫,一个小时后最后还是无奈看了题解qwq. 显然我们可以对于每个任务,从他的前导任务到他连一条边,最后我们可以得到一个DAG.在这 ...

  3. Xposed 集成 Android 6.0.1环境中,总结

    由于工作需要,需要将xposed集成到android源码中,生成新的ROM就自带xposed的功能. 下面大体上说一下步骤和遇到的问题. 1.下载,并编译android源码,成功. 2.下载 http ...

  4. Boost1.6x+win7+VC2015编译

    下载 通过boost官方网站, 或直接在source forge下载boost_1_6x_0. 可选包 Zlib library, 环境变量: ZLIB_SOURCE bzip2, 环境变量: BZI ...

  5. SQL 初级教程学习(四)

    1. union,union all SELECT E_Name FROM Employees_ChinaUNIONSELECT E_Name FROM Employees_USA 默认地,UNION ...

  6. Linux命令-自动挂载文件/etc/fstab功能详解

    Linux命令-自动挂载文件etcfstab功能详解 一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系 ...

  7. Ubuntu卸载软件包

    sudo apt-get autoremove --purge mysql-server-5.0 ,purge连同配置文件一起删除,autoremove自动卸载依赖包sudo apt-get remo ...

  8. (三)SpringIoc之初了解

    IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来 ...

  9. 7.JAVA-类继承、覆写、final关键字

    1.JAVA继承-extends 在java中,要想实现继承则使用extends关键字. 一般子类被称为派生类,父类称为基类(super) extends需要注意的地方: java不允许多重继承(一个 ...

  10. 微信小程序开发初次尝试-----实验应用制作(一)

    初次尝试微信小程序开发,在此写下步骤以做记录和分享. 1.在网上找了很多资料,发现这位知乎大神提供的资料非常全面. 链接 https://www.zhihu.com/question/50907897 ...