什么时候break?
1.(最小的值为max时表示)
if(t==max)
break;
2.(dis[start][end]已经确定)
if(p[end]==1)
break;
3.(所有的最小值都确定了)
if(j==num)
break;
#include <stdio.h>
#include <string.h>
#define max 999999999
int num,n;
char s[155][31];
int dis[155][155],p[155];
int find(int num,char *str){
int i;
for(i=0;i<num;i++){
if(strcmp(s[i],str)==0)
break;
}
return i;
}
int dijkstra(int start,int end,int num){
int i,j,t,k;
p[start]=1;
while(1){
t=max;
for(i=0;i<num;i++){
if(dis[start][i]<t && p[i]==0){//注意p[i]==0
t=dis[start][i];
k=i;
}
}
if(t==max)
break;
p[k]=1;
if(p[end]==1)
break;
for(i=0;i<num;i++){
if(dis[start][k]+dis[k][i]<dis[start][i]
&&dis[k][i]!=max){
dis[start][i]=dis[start][k]+dis[k][i];
}
}
j=0;
for(i=0;i<num;i++){
if(p[i]==1)
j++;
}
if(j==num)
break;
}
return dis[start][end];
}
int main(){
int i,j,k,x;
while(scanf("%d",&n)==1){
if(-1==n)
break;
memset(p,0,sizeof(p));
for(i=0;i<155;i++)
for(j=0;j<155;j++)
dis[i][j]=max;
for(i=0;i<155;i++)
dis[i][i]=0;
num=0;
scanf("%s",s[num++]);
scanf("%s",s[num++]);
for(i=0;i<n;i++){
scanf("%s",s[num]);
j=find(num,s[num]);
if(j==num)
num++;
scanf("%s",s[num]);
k=find(num,s[num]);
if(k==num)
num++;
scanf("%d",&x);
if(dis[j][k]>x){
dis[j][k]=dis[k][j]=x;
}
}
if(strcmp(s[0],s[1])==0 || n==0)
printf("0\n");
else if(dijkstra(0,1,num)==max)
printf("-1\n");
else
printf("%d\n",dijkstra(0,1,num));
}
return 0;
}