hdu3790(最短路dijstra)

来源:互联网 发布:淘宝卖衣服在哪找货源 编辑:程序博客网 时间:2024/05/16 07:43

题目链接:hdu3790

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N = 1006;const int inf = 0xfffffff;int map[N][N],n;int cost[N][N];//花费bool v[N];int dis[N];int val[N];void dijstra(int s, int e){    int i,j;    for(i = 1; i <= n; i ++)    {        dis[i] = map[s][i];        val[i] = cost[s][i];        v[i] = false;    }    v[s] = true;    for(i = 2; i <= n; i ++)    {        int minn = inf, pos = s;        for(j = 1; j <= n; j ++)        {            if(!v[j] && dis[j] < minn)            {                minn = dis[j];                pos = j;            }        }        v[pos] = true;        for(j = 1; j <= n; j ++)        {            if(!v[j] && map[pos][j] < inf)            {                if(dis[pos] + map[pos][j] < dis[j])                {                    dis[j] = dis[pos] + map[pos][j];                    val[j] = val[pos] + cost[pos][j];                }                if(dis[pos] + map[pos][j] == dis[j])//扩展到j点的距离相同时,判断最小花费                {                    if(val[pos] + cost[pos][j] < val[j])                    val[j] = val[pos] + cost[pos][j];                }            }        }    }    printf("%d %d\n",dis[e],val[e]);}int main(){    int m,x,y,a,b,i,j;    while(scanf("%d%d",&n,&m),(n||m))    {        for(i = 1; i <= n; i ++)        for(j = 1; j <= n; j ++)        map[i][j] = cost[i][j] = inf;        while(m--)//注意判断重边        {            scanf("%d%d%d%d",&x,&y,&a,&b);            if(map[x][y] > a)            {                map[x][y] = map[y][x] = a;                cost[x][y] = cost[y][x] = b;            }            if(map[x][y] == a)            cost[x][y] = cost[y][x] = min(cost[x][y],b);        }        scanf("%d%d",&x,&y);        dijstra(x,y);    }    return 0;}


0 0
原创粉丝点击