HDU-3970 最短路径问题

来源:互联网 发布:食品的分销网络 编辑:程序博客网 时间:2024/05/22 06:41
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1000 + 5;const long long INF = 0x7fffffff;int sign[maxn];struct node{    long long len;    long long cost;} graph[maxn][maxn], root[maxn];int n, m, op, ed;void Dijkstra(){    memset(sign, 0, sizeof(sign));    for(int i = 1; i <= n; i ++)    {        root[i].len = graph[op][i].len;        root[i].cost = graph[op][i].cost;    }    sign[op] = 1;    for(int k = 1; k <= n; k ++)    {        long long min_amount = INF;        long long min_money = INF;        int minn;        for(int i = 1; i <= n; i ++)            if(!sign[i] && (root[i].len < min_amount || (root[i].len == min_amount && root[i].cost < min_money)))            {                minn = i;                min_amount = root[i].len;                min_money = root[i].cost;            }        sign[minn] = 1;        for(int i = 1; i <= n; i ++)            if(!sign[i])            {                long long temp_len = root[minn].len + graph[minn][i].len;                long long temp_cost = root[minn].cost + graph[minn][i].cost;                if(temp_len < root[i].len || (root[i].len == temp_len && temp_cost < root[i].cost))                {                    root[i].len = temp_len;                    root[i].cost = temp_cost;                }            }    }}int main(){    while(~scanf("%d %d", & n, & m))    {        if(!n && !m)            break;        for(int i = 1; i <= n; i ++)            for(int j = 1; j <= n; j ++)            {                graph[i][j].len = INF;                graph[i][j].cost = INF;            }        int a, b, c, d;        while(m --)        {            scanf("%d %d %d %d", & a, & b, & c, & d);            if(c < graph[a][b].len || (c == graph[a][b].len && d < graph[a][b].cost))            {                graph[a][b].len = c;                graph[a][b].cost = d;                graph[b][a].len = c;                graph[b][a].cost = d;            }        }        scanf("%d %d", & op, & ed);        Dijkstra();        printf("%I64d %I64d\n", root[ed].len, root[ed].cost);    }    return 0;}
题意:
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。输入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)
题解:
也就是在上一题的基础上增加了花费的问题。注意重边。我一开始minn = op 用下标查找,但是这次错在了这里,但并不清楚原因。因为我认为root[op]的值始终等于INF,所以想用root[op]代替判断条件中的INF省点语句。但这次错了。还有就是while(1){if(root[minn] == INF) break;}用在这里跳出循环不行,会无限循环导致超时(具体原因还是不知)。
0 0
原创粉丝点击