SDUTOJ 2498 AOE网上的关键路径

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图。
 
  AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG。与AOV不同,活动都表示在了边上,如下图所示:
               
                     
   
如上所示,共有11项活动(11条边),9个事件(9个顶点)。整个工程只有一个开始点和一个完成点。即只有一个入度为零的点(源点)和只有一个出度为零的点(汇点)。
   
关键路径:是从开始点到完成点的最长路径的长度。路径的长度是边上活动耗费的时间。如上图所示,1
到2 到 5到7到9是关键路径(关键路径不止一条,请输出字典序最小的),权值的和为18。

输入

   
这里有多组数据,保证不超过10组,保证只有一个源点和汇点。输入一个顶点数n(2<=n<=10000),边数m(1<=m
<=50000),接下来m行,输入起点sv,终点ev,权值w(1<=sv,ev<=n,sv != ev,1<=w
<=20)。数据保证图连通。

输出

   
关键路径的权值和,并且从源点输出关键路径上的路径(如果有多条,请输出字典序最小的)。

示例输入

9 11
1 2 6
1 3 4
1 4 5
2 5 1
3 5 1
4 6 2
5 7 9
5 8 7
6 8 4
8 9 4
7 9 2

示例输出

18
1 2
2 5
5 7
7 9
 /*以后记住,输出路径的字典序最小,要反存边,才可以取到字典序*/
/*这个题目的精华就在把边反向存,而不是正向存,我们可以这样解释一下:路径的字典序最小就是我们走到一个点的时候,向下一步走时,选择编号最小的,这就是字典序,但是最短路的更新过程中,(dis[edge[l].v]==dis[x]+edge[l].w&&x<pre[edge[l].v],明显是对该点之前的点的编号取小,这样取出来,会有可能不是字典序
*/
#include<queue>
#define N 10010
#include<iostream>
#define M 50010
using namespace std;
#include<cstdio>
#include<cstring>
struct Edge{
int v,last,w;
}edge[M];
int head[N],ans[N],pre[N],n,m,dis[N],indu[N],chudu[N];
bool inque[N];
void add_edge(int u,int v,int w,int k)
{
edge[k].v=v;edge[k].w=w;
edge[k].last=head[u];
head[u]=k;
}
void input()
{
int u,v,w;
for(int i=;i<=m;++i)
{
scanf("%d%d%d",&u,&v,&w);
add_edge(v,u,w,i);
indu[u]++;chudu[v]++;
}
}
void spfa(int u,int v)
{
queue<int>que;
que.push(u);
pre[u]=;dis[u]=;
inque[u]=true;
while(!que.empty())
{
int x=que.front();
que.pop();
inque[x]=false;
for(int l=head[x];l;l=edge[l].last)
{
if(dis[edge[l].v]<dis[x]+edge[l].w||(dis[edge[l].v]==dis[x]+edge[l].w&&x<pre[edge[l].v]))
{
dis[edge[l].v]=dis[x]+edge[l].w;
pre[edge[l].v]=x;
if(!inque[edge[l].v])
{
inque[edge[l].v]=true;
que.push(edge[l].v);
}
}
}
}
}
void print(int u,int v)
{
printf("%d\n",dis[v]);
int t=v;
ans[++ans[]]=v;
while(pre[t]!=)
{
ans[++ans[]]=pre[t];
t=pre[t];
}
for(int i=;i<=ans[];++i)
printf("%d %d\n",ans[i-],ans[i]);
}
int main()
{
while(scanf("%d%d",&n,&m)==)
{
memset(dis,,sizeof(dis));
memset(edge,,sizeof(edge));
memset(head,,sizeof(head));
memset(indu,,sizeof(indu));
memset(chudu,,sizeof(chudu));
memset(pre,,sizeof(pre));
memset(ans,,sizeof(ans));
memset(inque,false,sizeof(inque));
input();
int u,v;
for(int i=;i<=n;++i)
{
if(!indu[i]) u=i;
if(!chudu[i]) v=i;
}
spfa(u,v);
print(u,v);
}
return ;
}

关键路径 SDUTOJ 2498的更多相关文章

  1. SDUTOJ 2498 数据结构实验之图论十一:AOE网上的关键路径

    题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2498.html 题目大意 略. 分析 ...

  2. sdut 2498【aoe 网上的关键路径】

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2498 代码超时怎么破: #include< ...

  3. SDUT 2498 AOE网上的关键路径

    AOE网上的关键路径 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一个无环的有向图称为无 ...

  4. sdut AOE网上的关键路径(spfa+前向星)

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2498&cid=1304 题目描述 一个无环的有向图称为无环图(Directed Acyc ...

  5. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  6. AOE网的关键路径的计算

    求关键路径,只需理解顶点(事件)和边(活动)各自的两个特征属性以及求法即可: Ø  先根据首结点的Ve(j)=0由前向后(正拓扑序列)计算各顶点的最早发生时间 Ø  再根据终结点的Vl(j)等于它的V ...

  7. 教你轻松计算AOE网关键路径(转)

    原文链接:http://blog.csdn.net/wang379275614/article/details/13990163 本次结合系统分析师-运筹方法-网络规划技术-关键路径章节,对原文链接描 ...

  8. sdutoj 2151 Phone Number

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2151 Phone Number Time Li ...

  9. sdutoj 2610 Boring Counting

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2610 Boring Counting Time ...

随机推荐

  1. 常用SQL查询语句

    一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ...

  2. 最小化安装centos7下配置网络

    虚拟机操作系统:centos7.0 命令行模式 1.首先明确centos7在最小化安装完是不支持上网的,相应的查看网络以及修改网络参数是不能使用的,最常见的就是我们常用的ifconfig. 2.找到网 ...

  3. .Net开源项目之开源论坛

    .Net开源项目非常多,但是开源并且直接就能用的BBS项目就很少了,至少最近我在这上面没有找到一个合适的开源论坛.可能是因为我要求比较特殊,不但要开箱即用,还要用MVC+MySql开发. Discuz ...

  4. vmware mysql报kernel: EXT4-fs (dm-0): Unaligned AIO/DIO on inode 1055943 by mysqld; performance will be poor

    kernel: EXT4-fs (dm-0): Unaligned AIO/DIO on inode 1055943 by mysqld; performance will be poor

  5. Exchange 2013 申请证书

    最近在了解Exchange2013,Exchange2013相对于Lync安装相对容易一点,安装完成并不代表就可以用了,还要一些基本的配制,首先介绍一下如何从证书服务器申请 CA. 一.DNS 创建解 ...

  6. React入门--------JSX

    React学习网站 React官方英文网站:http://reactjs.cn/react/docs/top-level-api.html React官方中文网站:http://www.css88.c ...

  7. Atitit.为什么小公司也要做高大上开源项目

    Atitit.为什么小公司也要做高大上开源项目 1. 为什么手头有很多加急的事情还要做高大上开源项目??1 2. 从长远看,发展 高大上开源项目计划对于解决我们在应急项目正面临着的种种严峻问题也大有裨 ...

  8. 关于Kb/s,KB/s的一些知识

    我们常见的有KB/s和Kb/s两种 1,Kb/s也就是Kbps.这里面小写的b是bit(比特)的缩写,是位的意思.一个位就是二进制的0或者1.一般代表传输单位,p就是/号,s是秒.bps就是b/s=比 ...

  9. Android Sqlite 实例入门

    通过一个简单的例子来学习Sqlite,学生选课系统,一开始的需求是学生可以选课,选课完成后可以查询到已经选择的课. 首先设计三个表,学生,课程,选课.学生表存储学生的信息,课程表存储课程的信息,选课表 ...

  10. 个人开源作品,即时通讯App支持文本、语音、图片聊天

    开源一个即时通讯类App,支持纯文本.语音.地理位置.图片聊天,同时还加入了好友圈功能,支持分享动态和发送图片,支持搜索附近的人,使用的百度地图定位功能:由Bmob后端云提供服务器支持,欢迎喜欢的伙伴 ...