最短路径问题

来源:互联网 发布:seo蜘蛛精有什么用 编辑:程序博客网 时间:2024/05/13 18:17

最短路径问题Crawling in process...Crawling failedTime Limit:1000MS    Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

SubmitStatus

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
#include <stdio.h>#include<string.h>#include<stdlib.h>#define inf 99999999int map[10010][10010];int cost[10010][10010];int dis[1010];int mon[1010];int vis[1010];int s,e;void dijkstra(int n){    int i,j,k;    int min;    for(i=1; i<=n; i++)    {        dis[i]=map[i][s];        mon[i]=cost[i][s];    }    vis[s]=1;    for(i=1;i<=n;i++)    {        k=s;        min=inf;        for(j=1;j<=n;j++)        {            if(dis[j]<min&&!vis[j])            {                k=j;                min=dis[k];            }        }        vis[k]=1;        for(j=1;j<=n; j++)        {            if(!vis[j])            {                if(dis[j]>dis[k]+map[j][k])                {                    dis[j]=map[j][k]+dis[k];                    mon[j]=mon[k]+cost[j][k];                }                else if(dis[j]==dis[k]+map[j][k]&&mon[j]>mon[k]+cost[j][k])                    mon[j]=mon[k]+cost[j][k];            }        }    }}int main(){    int n,m,i,j;    int a,b,d,p;    while(~scanf("%d %d",&n,&m))    {        if(n==0&&m==0)            break;        memset(vis,0,sizeof(vis));        for(i=1; i<=n; i++)            for(j=1; j<=n; j++)            {                if(i!=j)                    map[i][j]=inf;                else                    map[i][j]=0;            }        for(i=1; i<=m; i++)        {            scanf("%d %d %d %d",&a,&b,&d,&p);            if(map[a][b]>d)            {                map[a][b]=map[b][a]=d;                cost[a][b]=cost[b][a]=p;            }        }        scanf("%d%d",&s,&e);        dijkstra(n);        if(dis[e]!=inf)        printf("%d %d\n",dis[e],mon[e]);    }    return 0;}


0 0
原创粉丝点击