hdu 2112

什么时候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;
}




 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值