现在的位置: 首页 > 综合 > 正文

hdu 1690 可以用ballmanford算法,不过就是时间长点

2018年04月26日 ⁄ 综合 ⁄ 共 1183字 ⁄ 字号 评论关闭
//开始的时候在ford()函数中多加了两个等于号,tlr
#include<stdio.h>
#define data 99999999999ll
long long map[101][101],dis[101],ans;
int arr[101];
int l1,l2,l3,l4,c1,c2,c3,c4,n1,m1,d;
long long int ford(int n1,int aa,int bb)
{
    int i,j,k;
    for(i=1;i<=n1;i++)
        dis[i]=data;
    dis[aa]=0;
    for(k=1;k<n1;k++)
    {
      int flag=0;
      for(i=1;i<=n1;i++)
      {
         for(j=1;j<=n1;j++)
         {
            if(map[i][j]<data&&dis[i]<data)
//不包括等于的情况,否则tlr            {
                if(dis[j]>map[i][j]+dis[i])
                {    dis[j]=map[i][j]+dis[i];flag=1;}
            }
         }
      }
      if(flag==0)break;
    }
    return dis[bb];
}
int main()
{
    int n,i,j,flag=0;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d%d%d%d%d%d",&l1,&l2,&l3,&l4,&c1,&c2,&c3,&c4);
        scanf("%d%d",&n1,&m1);
        for(i=1;i<=n1;i++)
            scanf("%d",&arr[i]);
        for(i=1;i<=n1;i++)
            for(j=1;j<=n1;j++)
                if(i!=j)map[i][j]=data;
                else map[i][j]=0;
        for(i=1;i<=n1;i++)
        {
            for(j=i+1;j<=n1;j++)
            {
                 d=arr[i]-arr[j];
                if(d<0)d=-d;
                 if(0<d&&d<=l1)map[i][j]=map[j][i]=c1;
                 if(d>l1&&d<=l2)map[i][j]=map[j][i]=c2;
                 if(d>l2&&d<=l3)map[i][j]=map[j][i]=c3;
                 if(d>l3&&d<=l4)map[i][j]=map[j][i]=c4;

            }
        }
        
        flag++;
        printf("Case %d:\n",flag);
        int aa,bb;
        for(i=1;i<=m1;i++)
        {
            scanf("%d%d",&aa,&bb);
            ans=ford(n1,aa,bb);//map[aa][bb]
            if(ans<data)
                printf("The minimum cost between station %d and station %d is %I64d.\n",aa,bb,ans);
             else 
            printf("Station %d and station %d are not attainable.\n",aa,bb);
 
        }
    }
    return 0;
}

抱歉!评论已关闭.