您的位置:首页 > 其它

hdu 2544

2013-11-02 14:31 369 查看
#include<stdio.h>

#include<string.h>

#define N 1000

#define inf 0x7fffffff

int map[N+10][N+10],cost[N+10][N+10],dis[N+10],fee[N+10],visit[N+10];

void dijkstra(int s,int t,int n) {

int i,j;

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

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

dis[i]=map[s][i];

fee[i]=cost[s][i];

}

visit[s]=1;

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

int min=inf;

int u;

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

if(min>dis[j]&&visit[j]==0) {

min=dis[j];

u=j;

}

visit[u]=1;

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

if(visit[j]==0&&map[u][j]!=inf) {

if(dis[j]>dis[u]+map[u][j]) {//先求出一条最短路

dis[j]=dis[u]+map[u][j];

fee[j]=fee[u]+cost[u][j];

}

else

if(dis[j]==dis[u]+map[u][j]&&fee[j]>fee[u]+cost[u][j]) //然后再判断费用

fee[j]=fee[u]+cost[u][j];

}

}

}

printf("%d %d\n",dis[t],fee[t]);

}

int main(){

int n,m,i,j,k,a,b,d,p,s,t;

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

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

dis[i]=inf;

fee[i]=inf;

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

map[i][j]=inf;

}

while(m--) {

scanf("%d%d%d%d",&a,&b,&d,&p);

if(map[a][b]>d) {

map[a][b]=map[b][a]=d;

cost[a][b]=cost[b][a]=p;

}

else

if(map[a][b]==d&&cost[a][b]>p)

cost[a][b]=cost[b][a]=p;

}

scanf("%d%d",&s,&t);

dijkstra(s,t,n);

}

return 0;

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