hdu3790-最短路径最小值

来源:互联网 发布:大英雄郑成功 知乎 编辑:程序博客网 时间:2024/05/29 04:51

dijkstra模板上加一个花费的判断,注意判重边。

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 1005;const int INF = 0x7fffffff;int n,m;int Map[maxn][maxn], cost[maxn][maxn];void dijkstra(int st, int ed){    int vis[maxn], dis[maxn], val[maxn];    int v,minx;    memset(vis, 0, sizeof(vis));    vis[st] = 1;    for(int i=1; i<=n; i++)    {        dis[i] = Map[st][i];        val[i] = cost[st][i];    }    for(int i=1; i<=n; i++)    {        minx = INF;        for(int j=1; j<=n; j++)        {            if(!vis[j] && dis[j] < minx)            {                v = j;                minx = dis[j];            }        }        vis[v] = 1;        for(int j=1; j<=n; j++)        {            if(!vis[j] && Map[v][j] < INF)            {                if(dis[j] > dis[v]+Map[v][j])                {                    dis[j] = dis[v] + Map[v][j];                    val[j] = val[v] + cost[v][j];                }                else if(dis[j] == dis[v] + Map[v][j])                {                    val[j] = min(val[j], val[v] + cost[v][j]);                }            }        }    }    printf("%d %d\n",dis[ed],val[ed]);}int main(){    while(scanf("%d%d",&n,&m)!=EOF && n)    {        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)                Map[i][j] = cost[i][j] = INF;        while(m--)        {            int a, b, d, p;            scanf("%d%d%d%d", &a, &b, &d, &p);            if(Map[a][b]>d || (Map[a][b]==d && cost[a][b]>p))            {                Map[a][b] = Map[b][a] = d;                cost[a][b] = cost[b][a] = p;            }        }        int st, ed;        scanf("%d%d",&st, &ed);        dijkstra(st,ed);    }    return 0;}