zoj 1952 Heavy Cargo 最短路 Dijkstra

我写的第二道最短路。。。不得不承认,我对最短路理解的还是不透彻。。纠结了好长时间,总感觉不难不难但就是写不出来,对,就是这种感觉。。不过一天的时间没白费,一次就AC啦。。。

程序里input()函数的作用:

  将输入城市名转化为数字0~~n-1,这样接下来的处理会方便很多。

#include<stdio.h>
#include<string.h>
typedef struct ss
{
  char s[31];
}node;
int p,n,r,tx,ty;
node a[205];
char s1[31],s2[31];

int v[200],w[200][200],d[200];
void input() //将输入转化为易处理的方式 
{
    int i,j,ww,f1,f2;
    p=0;
    for(i=0;i<r;i++)
    {
      f1=f2=1; 
      scanf("%s%s%d",s1,s2,&ww);
      for(j=0;j<p;j++)
      {
        if(f1&&strcmp(a[j].s,s1)==0)
        {
          tx=j;
          f1=0;
        }  
        if(f2&&strcmp(a[j].s,s2)==0)
        {
          ty=j;
          f2=0;
        }
     }
     if(f1)
     {
       tx=p;     
       strcpy(a[p++].s,s1);
     }
     if(f2)
     {
       ty=p;     
       strcpy(a[p++].s,s2);
     }   
     w[tx][ty]=w[ty][tx]=ww; 
    } 
    scanf("%s%s",s1,s2);
    f1=f2=1;
    for(j=0;j<p&&(f1||f2);j++)
    {
      if(f1&&strcmp(a[j].s,s1)==0)
      {
        tx=j;
        f1=0;
      }  
      if(f2&&strcmp(a[j].s,s2)==0)
      {
        ty=j;
        f2=0;
      }
    }
}     
int main()
{
  int i,j,ncase=1;  
  while(scanf("%d%d",&n,&r)&&n)
  {
    memset(w,0,sizeof(w));    
    memset(v,0,sizeof(v));
    memset(d,0,sizeof(d));//d[i]中保存从源点到 i 点能带的最大货物 
    input();
    d[tx]=0;
    for(i=0;i<n;i++)
      if(w[tx][i]!=0)
        d[i]=w[tx][i];
    v[tx]=1;
    for(i=0;i<n;i++)
    {    
      int x,m=-1;    
      for(int y=0;y<n;y++)
        if(!v[y]&&d[y]>m) m=d[x=y];//每一次从d中找出d值最大的点 x 
      v[x]=1;        
      for(int y=0;y<n;y++) //从x出发更新其他d值 
        if(!v[y]&&w[x][y]!=0)//更新d值分两种情况 :是用 w[x][y]来更新d[y]还是用d[x]来更新d[y]; 
        {
          if(w[x][y]>=d[x]&&d[y]<d[x])  d[y]=d[x];
          if(w[x][y]<d[x]&&w[x][y]>d[y]) d[y]=w[x][y];
        }
    }
    printf("Scenario #%d\n",ncase++);
    printf("%d tons\n\n",d[ty]);
  } 
  return 0;   
}  
              
        


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值