您的位置:首页 > 其它

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 记录的他的 前驱结点

#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() ;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: