题目链接:最短路径问题
两个权值的最短路问题
SFPA +前向星 水过250ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
const int INF = 1e7;
using namespace std;
int n,m,t;
int ma[1001][1001],dis[1001],cost[1001];
bool vis[1001];
struct node{
int u,v,w, ww;
int next;
}edge[100001];
int head[100001];
void init()
{
memset(head,0,sizeof(head));
for(int i = 1;i<=n;i++)
{
dis[i] = INF;
cost[i] = INF;
vis[i] = 0;
}
t = 1;
}
int s,e;
void add(int a,int b,int c,int d)
{
edge[t].v = b;
edge[t].w = c;
edge[t].ww = d;
edge[t].next = head[a];
head[a] = t++;
}
void SPFA()
{
queue<int>q;
q.push(s);
vis[s] = true;
dis[s] = 0;
cost[s] = 0;
// int sum = 0;
while(!q.empty())
{
int p = q.front();
// printf("%d",p);
q.pop();
vis[p] = 0;
if(head[p])
{
for(int pp = head[p];pp!=0;pp = edge[pp].next)
{
// printf("->%d\n",edge[pp].v);
if(dis[p] + edge[pp].w < dis[edge[pp].v])
{
dis[edge[pp].v] = dis[p] + edge[pp].w ;
cost[edge[pp].v] = cost[p] + edge[pp].ww;
// sum += edge[pp].ww;
if(!vis[edge[pp].v])
{
q.push(edge[pp].v);
vis[edge[pp].v] = true;
}
}
else if(dis[p] + edge[pp].w == dis[edge[pp].v])
{
if(cost[edge[pp].v] > cost[p] + edge[pp].ww)
{
cost[edge[pp].v] = cost[p] + edge[pp].ww;
}
}
}
}
}
printf("%d %d\n",dis[e],cost[e]);
}
int main()
{
int a,b,c,d;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0 && m==0) break ;
init();
for(int i = 0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
add(a,b,c,d);
add(b,a,c,d);
}
scanf("%d%d",&s,&e);
SPFA();
}
return 0;
}HDU 3790 -最短路径问题,布布扣,bubuko.com
原文:http://blog.csdn.net/wjw0130/article/details/38235545