题目大意:给出n个点,m条关系,按关系的从小到大排序。

题目分析:拓扑排序的模板题,套模板。

kahn算法:

伪代码:

Kahn算法:

摘一段维基百科上关于Kahn算法的伪码描述:

L← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty
do
    remove a node n from S
    insert n into L
    foreach node m with an edge
e from nto m do
        remove edge e from thegraph
        ifm has no other incoming edges
then
            insert m into S
if graph has edges
then
    return error (graph has at least onecycle)
else
    return L (a topologically sortedorder)

维护一个入度为0的点的集合S,一个初始为空的集合L,L存放排好序的序列。将集合S中的一个点加入集合L后,在S中删除该点并破坏所有从该点出发的边,若被破坏的边的另一端点的入度为0,则加入S,一直处理到S为空。若仍有边存在,则存在环路,反之,集合L中的元素便是按拓扑序排放的。时间复杂度为O(E+V)。

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std; int mp[105][105],n,m,d[105];
vector<int>l;
queue<int>q; int judge(int u)
{
int cnt=0;
for(int i=1;i<=n;++i)
if(mp[i][u])
++cnt;
return cnt;
} void solve()
{
l.clear();
while(!q.empty()){
int u=q.front();
q.pop();
l.push_back(u); for(int i=1;i<=n;++i){
if(mp[u][i]){
mp[u][i]=0;
--d[i];
if(d[i]==0)
q.push(i);
}
}
}
for(int i=0;i<n;++i)
printf("%d%c",l[i],(i==n-1)?'\n':' ');
} int main()
{
int a,b;
while(scanf("%d%d",&n,&m)&&(n+m))
{
memset(mp,0,sizeof(mp));
while(m--){
scanf("%d%d",&a,&b);
mp[a][b]=1;
} while(!q.empty())
q.pop();
for(int i=1;i<=n;++i){
d[i]=judge(i);
if(d[i]==0)
q.push(i);
}
solve();
}
return 0;
}

  

基于dfs的拓扑排序:

同样摘录一段维基百科上的伪码:

L ← Empty list that will contain the sorted nodes
S ← Set of all nodes with no outgoing edges
for each node n in S
do
    visit(n)
function visit(node n)
    if n has not been visited yet
then
        mark n as visited
        for each node m with an edgefrom m to ndo
            visit(m)
        add n to L

维护一个出度为0的点的集合S,一个初始为空的集合L,L存放排好序的序列。对于集合S中的一个点e,先将所有应该排在e前面的点放到集合L之后,再将点e放入集合L。时间复杂度为O(E+V)。

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std; vector<int>l;
queue<int>q;
int n,m,mp[105][105],mark[105]; bool judge(int u)
{
for(int i=1;i<=n;++i)
if(mp[u][i])
return false;
return true;
} void visit(int u)
{
if(!mark[u]){
mark[u]=1;
for(int i=1;i<=n;++i)
if(mp[i][u])
visit(i);
l.push_back(u);
}
} void solve()
{
l.clear();
memset(mark,0,sizeof(mark));
while(!q.empty()){
int u=q.front();
q.pop();
visit(u);
}
for(int i=0;i<n;++i)
printf("%d%c",l[i],(i==n-1)?'\n':' ');
} int main()
{
int a,b;
while(scanf("%d%d",&n,&m)&&(n+m))
{
memset(mp,0,sizeof(mp));
while(m--)
{
scanf("%d%d",&a,&b);
mp[a][b]=1;
} while(!q.empty())
q.pop();
for(int i=1;i<=n;++i){
if(judge(i))
q.push(i);
}
solve();
}
return 0;
}

  

UVA-10305 Ordering Tasks (拓扑排序)的更多相关文章

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

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

  2. UVa 10305 - Ordering Tasks (拓扑排序裸题)

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

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

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

  4. UVA 10305 Ordering Tasks(拓扑排序的队列解法)

    题目链接: https://vjudge.net/problem/UVA-10305#author=goodlife2017 题目描述 John有n个任务,但是有些任务需要在做完另外一些任务后才能做. ...

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

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

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

    题意:给定优先关系进行拓扑排序. 分析:将入度为0的点加入优先队列,并将与之相连的点入度减1,若又有度数为0的点,继续加入优先队列,依次类推. #pragma comment(linker, &quo ...

  7. UVa 10305 Ordering Tasks (例题 6-15)

    传送门: https://uva.onlinejudge.org/external/103/10305.pdf 拓扑排序(topological sort)简单题 自己代码的思路来自: ==>  ...

  8. M - Ordering Tasks(拓扑排序)

    M - Ordering Tasks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Descri ...

  9. Ordering Tasks 拓扑排序

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

  10. uva 10305 ordering tasks(超级烂题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHIAAAHDCAYAAABI5T2bAAAgAElEQVR4nOydPY7svLW1awQGNABHCm

随机推荐

  1. 热力图实现-heatmap.js 代码示例

    Heatmap.js  – 最强大的 Web 动态热图 最新公司项目需要用到热力图,在百度上搜下,了解到heatmap.js这款神器.然后搜了下例子,却很难搜到马上出效果的例子,特此写一篇heatma ...

  2. 使用DBMS_SUPPORT包

    DBMS_SUPPORT包从Oracle7.2引入,主要功能用以提供更完整的用户session跟踪信息,这个包可以通过运行 dbmssupp.sql 和 prvtsupp.plb 两个脚本来创建.该脚 ...

  3. Spring 体系结构

    https://www.w3cschool.cn/wkspring/dcu91icn.html 体系结构 Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你 ...

  4. 【剑指Offer】俯视50题之1-10题

    面试题1赋值运算符函数  面试题2 实现Singleton模式  面试题3 二维数组中的查找   面试题4 替换空格   面试题5 从头到尾打印链表   面试题6 重建二叉树   面试题7 用两个栈实 ...

  5. DZNEmptyDataSet 使用

    gitHub地址:https://github.com/dzenbot/DZNEmptyDataSet 效果图: 代码: #import "UIScrollView+EmptyDataSet ...

  6. centos Linux系统日常管理1 cpuinfo cpu核数 命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ,lsof ,pidof 第十四节课

    centos Linux系统日常管理1  cpuinfo cpu核数   命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ...

  7. 9.python的列表

    list2 = [1, 2, 3, 4, 5, 6, 7 ]; print ("list2[1:5]: ", list2[1:5]) 得到 list2[1:5]:  [2, 3, ...

  8. 统计编程的框架与R语言统计分析基础——摘(1)

    清屏命令ctrl+L 一.基础 1.产生数据结构 a.直接输入 b.冒号,1:10 c.seq函数 d.rep函数 > 1:10 [1] 1 2 3 4 5 6 7 8 9 10 > 10 ...

  9. 前端基础(CSS)

    CSS 语法 .clearfix:after{ content: ""; display: block; clear: both; } 解决 float 块之后的塌陷(后面增加了一 ...

  10. HDU 1879 继续畅通工程(Prim||Kruscal模板题)

    原题链接 Prim(点归并) //异或运算:相同为假,不同为真 #include<cstdio> #include<algorithm> #define maxn 105 us ...