您的位置:首页 > 其它

hdu_3788_单源最短路

2011-03-11 19:34 218 查看
//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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: