我写的第二道最短路。。。不得不承认,我对最短路理解的还是不透彻。。纠结了好长时间,总感觉不难不难但就是写不出来,对,就是这种感觉。。不过一天的时间没白费,一次就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;
}