算法标签:最短路+DP
难度:提高+/省选-
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define N 155
#define M 25010
#define V 505
int n,m,d,cnt,h[N],v[N][V];
double f[N][V];
struct NodeA
{
int nxt,to,l,v;
}e[M];
struct NodeB
{
int x,y;
}lst[N][V];
queue <NodeB> q;
void AddEdge (int x,int y,int v,int l)
{
e[++cnt].nxt=h[x];h[x]=cnt;
e[cnt].to=y;e[cnt].v=v;e[cnt].l=l;
}
void Init ()
{
scanf ("%d %d %d",&n,&m,&d);
for (int i=1;i<=m;i++)
{
int x,y,v,l;
scanf ("%d %d %d %d",&x,&y,&v,&l);
AddEdge (x,y,v,l);
}
}
void SPFA ()
{
memset (f,127,sizeof (f));
memset (lst,-1,sizeof (lst));
f[0][70]=0;
NodeB s;
s.x=0;s.y=70;
q.push (s);
v[0][70]=1;
while (!q.empty ())
{
int x=q.front ().x;
int v1=q.front ().y;
q.pop ();
v[x][v1]=0;
for (int i=h[x];i;i=e[i].nxt)
{
int y=e[i].to,v2=e[i].v,l=e[i].l;
if (v2==0) v2=v1;
if (f[x][v1]+l*1.0/v2<f[y][v2])
{
f[y][v2]=f[x][v1]+l*1.0/v2;
lst[y][v2].x=x;lst[y][v2].y=v1;
if (v[y][v2]==0)
{
NodeB s;
s.x=y;s.y=v2;
q.push (s);
v[y][v2]=1;
}
}
}
}
}
void Print (int x,int v)
{
if (x==-1) return;
Print (lst[x][v].x,lst[x][v].y);
printf ("%d ",x);
}
void Work ()
{
SPFA ();
int ans=0;
for (int i=1;i<V;i++)
if (f[d][ans]>f[d][i]) ans=i;
Print (d,ans);
putchar ('\n');
}
int main ()
{
Init ();
Work ();
return 0;
}
最短路径算法与动态规划
5500

被折叠的 条评论
为什么被折叠?



