HDU 3790 最短路径问题

来源:互联网 发布:php源码 鲶鱼 编辑:程序博客网 时间:2024/05/15 00:19

题目链接

题目意思

给你n个点,m条无向边,现在要从一个城市到另一个城市,要求最短路,如果最短路径有多条,就选花费最小的那条路。

解题思路

这道题就是在模板题上稍微做一下修改即可,就是在判断最短路的时候如果最短路相同,就再判断一下最小花费即可。

代码部分

#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#include <queue>using namespace std;const int INF=99999;int a,b,d,p;int n,m;int dis[1010];///存储最短距离int value[1010];///最小花费int vis[1010];///标记数组int map[1010][1010];///存储两点间的距离int cost[1010][1010];///存储两点间的花费void dijkstra(int u,int v){    int pos=u;    for(int i=1; i<=n; i++)    {        dis[i]=map[u][i];        value[i]=cost[u][i];    }    memset(vis,0,sizeof(vis));    vis[u]=1;    for(int i=1; i<=n; i++)    {        int min=INF;        for(int j=1; j<=n; j++)        {            if(!vis[j]&&min>dis[j])            {                min=dis[j];                pos=j;            }        }        vis[pos]=1;        for(int j=1; j<=n; j++)        {            if(!vis[j]&&map[pos][j]<INF)            {                if(dis[j]>map[pos][j]+dis[pos])                {                    dis[j]=map[pos][j]+dis[pos];                    value[j]=value[pos]+cost[pos][j];                }                else if(dis[j]==map[pos][j]+dis[pos])                {                    if(value[j]>value[pos]+cost[pos][j])                        value[j]=value[pos]+cost[pos][j];                }            }        }    }    printf("%d %d\n",dis[v],value[v]);}int main(){    int st,ed;    while(~scanf("%d%d",&n,&m),n+m)    {        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)            {                map[i][j]=INF;                cost[i][j]=INF;            }        for(int 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;            }            else if(map[a][b]==d)            {                if(cost[a][b]>p)                    cost[a][b]=cost[b][a]=p;            }        }        scanf("%d%d",&st,&ed);        dijkstra(st,ed);    }    return 0;}
原创粉丝点击