sdut 2498 AOE网上的关键路径 (最短路 算法)
2012-12-08 10:40
99 查看
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2498
题意:给定 一个 有向图 ,求出 从 图中只有 一个 入度为0 的点 s 和 一个 出度 为0 的 点 t 求 s 到t的 最长路径 若有 多条 输出 字典序最小的!
题解:
SPFA + 反向建图 。
对于 所要求的路径 ,s 的下一个点 是 与 s相连 且 距离 t 最长的点 ,若有 多个 选择序号 最小的 。
所以 自然 想到 求 各个点 到 t 的 最短距离 ,这样就 用到了 反向建图,并用 pre 记录的他的 前驱结点
题意:给定 一个 有向图 ,求出 从 图中只有 一个 入度为0 的点 s 和 一个 出度 为0 的 点 t 求 s 到t的 最长路径 若有 多条 输出 字典序最小的!
题解:
SPFA + 反向建图 。
对于 所要求的路径 ,s 的下一个点 是 与 s相连 且 距离 t 最长的点 ,若有 多个 选择序号 最小的 。
所以 自然 想到 求 各个点 到 t 的 最短距离 ,这样就 用到了 反向建图,并用 pre 记录的他的 前驱结点
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<set> #include<map> #include<queue> #include<vector> #include<string> #define inf 99999999 #define maxn 15000 #define CL(a,b) memset(a,b,sizeof(a)) #define ll long long //#define mx 1000010 using namespace std; int n, m ,s,t; int in[maxn],out[maxn] ; struct node { int u ; int v; int w; int next; }p[maxn*4] ; int cnt ; int head[maxn] ; void add(int u,int v,int w) { p[cnt].u = u; p[cnt].v= v; p[cnt].w = w ; p[cnt].next = head[u] ; head[u] = cnt++ ; } queue<int>que; int dis[maxn],pre[maxn] ; int a[maxn] ; int vis[maxn] ; void solve() { int i ; for(i = 0; i <= n;i++) { dis[i] = -inf ; pre[i] = inf ; } while(!que.empty())que.pop() ; CL(vis, 0) ; dis[s] = 0 ; que.push(s) ; vis[s] = 1 ; while(!que.empty()) { int u = que.front() ;que.pop() ; vis[u] = 0 ; for(i = head[u] ; i != -1;i = p[i].next) { int v = p[i].v ; int w = p[i].w ; if(dis[u] + w >= dis[v]) { if(dis[u] + w > dis[v]) { dis[v] = dis[u] + w; pre[v] = u ; if(!vis[v]) que.push(v) ; } if(dis[u] + w == dis[v]) { if(u < pre[v]) { pre[v] = u ; if(!vis[v]) que.push(v) ; } } } } } int num = 0; int tmp = t ; while(tmp != s) { a[num++] = tmp; tmp= pre[tmp] ; } a[num] = s; printf("%d\n",dis[t]) ; for(i = 0 ; i< num;i++) { printf("%d %d\n",a[i],a[i + 1]) ; } } int main() { int i ,x,y,d ; while(scanf("%d%d",&n,&m)!=EOF) { cnt = 0 ; CL(head, -1) ; for(i = 0 ; i<= n;i++) { out[i] = in[i] = 0 ; } for(i =0 ; i < m;i++) { scanf("%d%d%d",&x,&y,&d); out[y]++; in[x] ++ ; add(y,x,d) ; } for(i = 1; i <= n;i++) { if(in[i] == 0) s = i; if(out[i] == 0) t = i ; } solve() ; } }
相关文章推荐
- SDUTOJ 2498 AOE网上的关键路径 最短路spfa
- 关键路径的基于P矩阵的算法程序实现-----我网上搜集的(非本人原创)
- AOE网上的关键路径
- SDUT OJAOE网上的关键路径
- 关键路径过程详解、算法及其实现
- AOE网上的关键路径
- AOE网上的关键路径(最长路径 + 打印路径)
- AOE网上的关键路径
- 数据结构实验之图论十一:AOE网上的关键路径
- 图的关键路径算法
- 数据结构——邻接表表示的图的关键路径算法
- 算法笔记---最短路路径之Floyd(弗洛伊德)算法
- AOE网上的关键路径(拓扑排序+SPFA算法)
- 算法:AOE网(Activity On edge Network)与关键路径简介
- 数据结构实验之图论十一:AOE网上的关键路径
- 关键路径求解算法
- 加权有向图----关键路径算法
- 数据结构实验之图论:AOE网上的关键路径
- SDUT-2498 AOE网上的关键路径
- sdut AOE网上的关键路径(spfa+前向星)