HDU 3790

来源:互联网 发布:java bloomfilter原理 编辑:程序博客网 时间:2024/06/05 16:54

#include<stdio.h>#include<string.h>#define INF 10000001;int dist[1001],map[1001][1001],val[1001][1001],co[1001],p[1001];int main(){    int n,i,j,k,m,a,b,d,pr,s,gl,min;    while(~scanf("%d%d",&n,&m)&&n+m)    {        for(i = 1;i <= n;i ++)        {            for(j = 1;j <= n;j ++)            {                map[i][j] = INF;                val[i][j] = INF;            }        }        for(i = 0;i < m;i ++)        {            scanf("%d%d%d%d",&a,&b,&d,&pr);            if(d < map[a][b])            {                map[b][a] = map[a][b] = d;                val[b][a] = val[a][b] = pr;            }            else if(d == map[a][b])            {                if(pr < val[a][b])                    val[a][b] = val[b][a] = pr;            }        }        scanf("%d%d",&s,&gl);        memset(p,0,sizeof(p));        for(i = 1;i <= n;i ++)        {            dist[i] = map[s][i];            co[i] = val[s][i];        }        p[s] = 1;        k = 0;        for(i = 1;i <= n-1;i ++)        {            min = INF;            for(j = 1;j <= n;j ++)            {                if(!p[j]&&dist[j] < min)                {                    min = dist[j];                    k = j;                }            }            p[k] = 1;            for(j = 1;j <= n;j ++)        //更新是此算法的核心,重点!!!            {                if(!p[j] && dist[k]+map[k][j] < dist[j])                {                    dist[j] = dist[k]+map[k][j];                    co[j] = co[k]+val[k][j];                }                else if(!p[j] && dist[k]+map[k][j] == dist[j])                {                    if(co[j] > co[k]+val[k][j])                        co[j] = co[k]+val[k][j];                }            }        }        printf("%d %d\n",dist[gl],co[gl]);    }    return 0;}


0 0