HDU 3790 最短路

来源:互联网 发布:linux 文件所有者 编辑:程序博客网 时间:2024/05/20 05:47
/*    这个题目要注意的是当路径相同时要取费用最少的哪一条    其它的只要按照最短路的常规用法即可*/#include<iostream>using namespace std;const int maxn = 1000000;int n, m, d[1002][1002], p[1002][1002], dis[1002], pis[1002];bool vis[1002];void Dijk(int st, int ed){    for(int i = 1; i <= n; i++)//从1-n    {        dis[i] = d[st][i];        pis[i] = p[st][i];    }    vis[st] = true;    for(int k = 1; k < n; k++)    {        int Min = maxn, mj = -1;        for(int i = 1; i <= n; i++)            if(!vis[i] && dis[i]<Min) Min = dis[i], mj = i;        vis[mj] = true;        for(int i = 1; i <= n; i++)        {            if(!vis[i] && dis[i]>dis[mj]+d[mj][i])//必须保证mj-i要有通路            {                dis[i] = dis[mj]+d[mj][i];                pis[i] = pis[mj]+p[mj][i];            }            if(!vis[i] && dis[i]==dis[mj]+d[mj][i] && pis[i]>pis[mj]+p[mj][i])                pis[i] = pis[mj]+p[mj][i];        }    }    cout << dis[ed] << " " << pis[ed] << endl;}int main(){    while(cin >> n >> m && n||m)    {        int st, ed;        for(int i = 1; i <= n; i++)        {            vis[i] = false;            for(int j = 1; j <= n; j++)                if(i != j) d[i][j] = d[j][i] = p[i][j] = p[j][i] = maxn;                else d[i][j] = p[i][j] = 0;        }        while(m--)        {            int a, b, c, e;            cin >> a >> b >> c >> e;            if(d[a][b] > c)            {                d[a][b] = d[b][a] = c;                p[a][b] = p[b][a] = e;            }            if(d[a][b] == c)                if(p[a][b] > c)                    p[a][b] = p[b][a] = e;        }        cin >> st >> ed;        Dijk(st,ed);    }    return 0;}

0 0
原创粉丝点击