首页 > 代码库 > HDU3790 最短路径问题【Dijsktra算法】

HDU3790 最短路径问题【Dijsktra算法】

最短路径问题


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

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 2
1 2 5 6
2 3 4 5
1 3
0 0
 
Sample Output
9 11
 
Source

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


题目大意:上边说的很清楚了,边之间多了花费。求图中两点间的最短路径,

如果最短路径有多个,输出花费最少的那个。

思路:Dijkstra算法来求单源最短路径,在更新路径的时候如果距离相等,则更

花费。最后注意输入的时候判断下,避免重边。


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 1010;

int Map[MAXN][MAXN],Cost[MAXN][MAXN],Dist[MAXN],Value[MAXN],N,M;
bool vis[MAXN];

void Dijkstra(int N,int s)
{
    int Min;
    for(int i = 1; i <= N; ++i)
    {
        if(i != s)
        {
            Dist[i] = Map[s][i];
            Value[i] = Cost[s][i];
        }
    }
    Dist[s] = 0;
    vis[s] = true;
    for(int i = 1; i <= N-1; ++i)
    {
        Min = 0xffffff0;
        int k = 0;
        for(int j = 1; j <= N; ++j)
        {
            if(!vis[j] && Dist[j] < Min)
            {
                Min = Dist[j];
                k = j;
            }
        }
        if(k == 0)
            return;
        vis[k] = true;
        for(int j = 1; j <= N; ++j)
        {
            if(!vis[j] && Map[k][j] != 0xfffff0 && Dist[j] > Dist[k] + Map[k][j])
            {
                Dist[j] = Dist[k] + Map[k][j];
                Value[j] = Value[k] + Cost[k][j];
            }
            else if(!vis[j] && Map[k][j] != 0xfffff0 && Dist[j] == Dist[k] + Map[k][j])
            {
                if(Value[j] > Value[k] + Cost[k][j])
                    Value[j] = Value[k] + Cost[k][j];
            }
        }
    }
}
int main()
{
    int a,b,d,p;
    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] = Cost[i][j] = 0xffffff0;
        memset(vis,false,sizeof(vis));
        memset(Dist,0,sizeof(Dist));
        memset(Value,0,sizeof(Value));
        for(int i = 0; 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)
            {
                Map[a][b] = Map[b][a] = d;
                if(Cost[a][b] > p)
                    Cost[a][b] = p;
            }


        }
        scanf("%d%d",&a,&b);
        Dijkstra(N,a);
        printf("%d %d\n",Dist[b],Value[b]);
    }

    return 0;
}


HDU3790 最短路径问题【Dijsktra算法】