最短路径问题2

来源:互联网 发布:淘宝达人管理中心地址 编辑:程序博客网 时间:2024/06/09 14:01

http://acm.hdu.edu.cn/showproblem.php?pid=3790

这次用spfa算法,结果比ford算法差不多,可能更慢;

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18341    Accepted Submission(s): 5494


Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 

Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 

Output
输出 一行有两个数, 最短距离及其花费。
 

Sample Input
3 21 2 5 62 3 4 51 30 0
 

Sample Output
9 11
 

Source
浙大计算机研究生复试上机考试-2010年
 

#include <cstdio>#include <vector>#include <cstring>#include <queue>using namespace std;const int Max=1<<30;struct node{    int v,d,w;    node(int vv,int dd,int ww):v(vv),d(dd),w(ww){}    node(){}};vector<vector<node> >G;int N,M;void spfa(int s,int t){    queue<int> q;    int dis[1010],pri[1010];    for(int i=1;i<=N;i++)        dis[i]=pri[i]=Max;    dis[s]=pri[s]=0;    q.push(s);    while(!q.empty()){        int u=q.front();        q.pop();        for(int i=0;i<G[u].size();i++){            int v=G[u][i].v;            int d=G[u][i].d;            int w=G[u][i].w;            if(dis[u]+d<dis[v]){                dis[v]=dis[u]+d;                pri[v]=pri[u]+w;                q.push(v);            }            else if(dis[u]+d==dis[v]&&pri[u]+w<pri[v]){                pri[v]=pri[u]+w;                q.push(v);            }        }    }        printf("%d %d\n",dis[t],pri[t]);}int main(){   while(scanf("%d%d",&N,&M)&&N+M){       G.clear();       G.resize(N+10);       for(int i=0;i<M;i++){        int u,v,d,p;        scanf("%d%d%d%d",&u,&v,&d,&p);        G[u].push_back(node(v,d,p));        G[v].push_back(node(u,d,p));   }   int s,t;   scanf("%d%d",&s,&t);   spfa(s,t);   }   return 0;}


0 0
原创粉丝点击