hdoj 3790 最短路径问题(根据两个变量的最短路)

来源:互联网 发布:剑网3如何捏脸数据 编辑:程序博客网 时间:2024/05/02 16:00
多加一个判断就好- -
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 1000 + 10;const int MAX = 0xfffffff;int map[N][N], cost[N][N];int min_dist, min_cost;void Dijkstra(int s, int t, int n){    int dist[N],cost1[N];    bool visit[N];    int i,j;    memset(visit, false, sizeof(visit));    for(int i = 1; i <= N; ++i)    {        dist[i] = map[s][i];        cost1[i] = cost[s][i];    }    dist[s]=0;    visit[s]=true;    for(i=1;i<n;++i)    {        int min = MAX;        int k;        for(j=1;j<=n;++j)        {            if(!visit[j]&&min>dist[j])            {                min=dist[j];                k=j;            }        }        visit[k]=true;        for(j=1;j<=n;++j)        {            if(!visit[j]&&dist[j]>min+map[k][j])            {                dist[j]=min+map[k][j];                cost1[j]=cost[k][j]+cost1[k];            }            else if(!visit[j]&&dist[j]==min+map[k][j]&&cost1[j]>cost[k][j]+cost1[k])            {                cost1[j]=cost[k][j]+cost1[k];            }        }        if(visit[t])        {            min_dist=dist[t];            min_cost=cost1[t];            return ;        }    }    min_dist=dist[t];    min_cost=cost1[t];}int main(){    int n,m,i,j;    while(scanf("%d%d",&n,&m)&&(m||n))    {        for(i=1;i<=n;++i)            for(j=1;j<i;++j)            {                map[i][j]=map[j][i]=MAX;                cost[i][j]=cost[j][i]=MAX;            }        while(m--)        {            int a,b,c,d;            scanf("%d%d%d%d",&a,&b,&c,&d);            if(map[a][b]>c)            {                map[a][b]=map[b][a] =c;                cost[a][b]=cost[b][a]=d;            }        }        int s,t;        scanf("%d%d",&s,&t);        Dijkstra(s,t,n);        printf("%d %d\n",min_dist,min_cost);    }    return 0;}

0 0