hdu_3788_单源最短路

//dij的模板,增加一个域,保存两点之间的花费

#include<iostream>

#include<cstdio>

#include<memory.h>

#include <deque>

using namespace std;

 

struct edge

{

    int p,q;   //p为距离,q为花费,p的优先级比q高

}g[1001][1001];

struct dis_cos

{

    int d,c;    //d,c对应edge结构的p,q

}dis[1001];

 

int visit[1001];

int n,m;

#define max 100000000

 

void dij(int s)

{

 int i,j;

 memset(visit,0,sizeof(visit));

 visit[s]=1;

 for(j=1;j<=n;j++)

 {

     dis[j].d=g[s][j].p;

     dis[j].c=g[s][j].q;

 }

 int min1,min2,index;

 for(i=1;i<n;i++)

 {

     min1=max;

     min2=max;

     for(j=1;j<=n;j++)

         if(!visit[j]&&dis[j].d<min1)

         {

             index=j;

             min1=dis[j].d;

         }

         else if(!visit[j]&&dis[j].d==min1&&dis[j].c<min2)

         {

             index=j;

             min2=dis[j].c;

         }

     if(min1==max&&min2==max)

         break;

     visit[index]=1;

     for(j=1;j<=n;j++)

         if(!visit[j]&&dis[index].d+g[index][j].p<dis[j].d)

         {

             dis[j].d=dis[index].d+g[index][j].p;

             dis[j].c=dis[index].c+g[index][j].q;

         }

         else if(!visit[j]&&dis[index].d+g[index][j].p==dis[j].d&&dis[index].c+g[index][j].q<dis[j].c)

         {

             dis[j].c=dis[index].c+g[index][j].q;

         }

 }

}

 

int main()

{

    while(scanf("%d%d",&n,&m),n&&m)

    {

        int i,j,x,y,p,q;

        for(i=1;i<=n;i++)

            for(j=1;j<=n;j++)

            {

                g[i][j].p=(i==j?0:max);

                g[i][j].q=(i==j?0:max);

            }

        while(m--)

        {

            scanf("%d%d%d%d",&x,&y,&p,&q);

            if(g[x][y].p>p)

            {

                g[x][y].p=p;

                g[x][y].q=q;

                g[y][x]=g[x][y];

            }

            else if(g[x][y].p==p&&g[x][y].q>q)

            {

                g[x][y].q=q;

                g[y][x]=g[x][y];

            }

        }

        scanf("%d%d",&x,&y);

        dij(x);

        printf("%d %d/n",dis[y].d,dis[y].c);

    }

    return 0;

}

你可能感兴趣的:(c,struct,ini)