地址
点击打开链接
这个题目,我看了一下网上的,感觉没太看懂,于是按照正常的dj写了一遍
Map里存的是费用,也就是最后找什么最小那么咱们就存什么,等我复习回来的时候再用floyd做一遍。
代码如下,注意long long ,无论是输入还是输出,还有INF的最大值,因为是64位的,所以INF,取了1e18的大小
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
using namespace std;
#define MAX 1005
const long long INF = 1e18;
long long low[MAX];
long long Map[MAX][MAX];
int flags[MAX];
long long dis[MAX];
long long L[5],C[5];
int num,n, m , from, target;
void dijkstra(int start){
memset(low,0,sizeof(low));
memset(flags,0,sizeof(flags));
for(int i = 1 ; i <= n ;i ++)
{
low[i]=Map[start][i];
}
flags[start]=1;
int pos ;
long long Ma;
for(int i = 1 ; i <= n ; i ++)
{
Ma= INF;
for(int j = 1 ; j <= n ; j++)
{
if(!flags[j]&&Ma>low[j])
{
Ma = low[j];
pos = j ;
}
}
if(Ma ==INF)
{
return ;
}
flags[pos]= 1 ;
for(int j =1 ; j <=n ; j ++)
{
if(!flags[j]&&low[j]>Ma+Map[pos][j])
{
low[j] = Ma+Map[pos][j];
}
}
}
}
int init(){
for(int i = 1 ; i <= n ; i ++)//把每个点直接到其他点的花费都计算出来,超出的权威INF;
{
for(int j =1 ;j <=n ; j ++)
{
if(i==j)
Map[i][j]=0;
else {
long long temp = abs(dis[j]-dis[i]);
if(temp<=L[1])
{
Map[i][j]=Map[j][i]= C[1];
}else if(temp>L[1]&&temp<=L[2])
{
Map[i][j]=Map[j][i] =C[2];
}else if(temp>L[2]&&temp<=L[3])
{
Map[i][j]=Map[j][i] =C[3];
}else if(temp>L[3]&&temp<=L[4])
{
Map[i][j]=Map[j][i] =C[4];
}else {
Map[i][j]=Map[j][i] =INF;
}
}
}
}
}
int main(){
int index = 1 ;
scanf("%Id",&num);
while(num--)
{
for(int i= 1 ;i<5;i ++)
{
cin>>L[i];
}
for(int i= 1 ;i<5;i ++)
{
cin>>C[i];
}
scanf("%d%d",&n,&m);
for(int i = 1 ; i<= n ;i++)
{
scanf("%I64d",&dis[i]);//第i个车站的位置dis[i]
}
init();
printf("Case %d:\n",index++);
while(m--)
{
scanf("%d%d",&from,&target);
dijkstra(from);
if(low[target]==INF)
{
printf("Station %d and station %d are not attainable.\n",from,target);
}else
printf("The minimum cost between station %d and station %d is %I64d.\n",from,target,low[target]);
}
}
return 0 ;
}