您的位置:首页 > 理论基础 > 数据结构算法

PTA 数据结构与算法题目集(中文)5-9 旅游规划 (25分)

2017-04-15 16:42 441 查看
#include <stdio.h>

/*

Dijkstra算法 ,对于收费:

bis[j]=bis[u]+b[u][j];在路径改变或路径相同收费更少时改变 

*/

#define inf 9999999

int n,m,s,d;

int vis[505];

int dis[505];

int bis[505];

int a[505][505];

int b[505][505];

void disg()

{
for(int i=0;i<n;i++)
{
vis[i]=0;
dis[i]=a[s][i];
bis[i]=b[s][i];
}
dis[s]=0;
vis[s]=1;
for(int i=1;i<n;i++)
{
int min=inf;
int u=s;
for(int j=0;j<n;j++)
{
if(!vis[j]&&min>dis[j])
{
u=j;
min=dis[j];
}
vis[u]=1;
for(int j=0;j<n;j++)
{
if(dis[u]+a[u][j]<dis[j])
{
dis[j]=dis[u]+a[u][j];
bis[j]=bis[u]+b[u][j];
}
else if(dis[u]+a[u][j]==dis[j]&&bis[j]>bis[u]+b[u][j])
bis[j]=bis[u]+b[u][j];

}
}
}
printf("%d %d\n",dis[d],bis[d]);

}

int main()

{
scanf("%d %d %d %d",&n,&m,&s,&d);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i==j)a[i][j]=b[i][j]=0;
else a[i][j]=b[i][j]=inf;
for(int i=0;i<m;i++)
{
int u,v,test,cost;
scanf("%d %d %d %d",&u,&v,&test,&cost);
if(a[u][v]==test&&b[u][v]>cost)b[u][v]=b[v][u]=cost;
else if(a[u][v]>test)
{
a[u][v]=a[v][u]=test;
b[u][v]=b[v][u]=cost;
}
}
disg();
return 0;

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