hdu 2112 HDU Today

认真读题,题中有很多坑,字符串处理能力有待提高。

#include<stdio.h>
#include<string.h>
#define inf 10000
int map[200][200],dis[200],used[200];
char s[200][50];
void dijkstra(int n){
	int i,j,k,max;
	for(i=1;i<=n;i++){
		dis[i]=map[1][i];
		//printf("%d ",dis[i]);
	}
	dis[1]=0;used[1]=1;
	for(i=1;i<=n;i++){
		max=inf;
		for(j=1;j<=n;j++){
			if(!used[j]&&max>dis[j]){
				max=dis[j];
				k=j;
			}
		}
		used[k]=1;
		for(j=1;j<=n;j++)
		if(!used[j]&&dis[k]+map[k][j]<dis[j]){
			dis[j]=dis[k]+map[k][j];
		}
	} 
}//dijkstra算法 
int main(){
	int i,j,t,x,y,k,n;
	char a[50],b[50];
	while(scanf("%d",&n),n!=-1){
		memset(s,0,sizeof(s));
		memset(dis,0,sizeof(dis));
		memset(used,0,sizeof(used));
		for(i=1;i<=150;i++)
		for(j=1;j<=150;j++){
			map[i][j]=inf;
		}
		scanf("%s%s",s[1],s[2]);
		j=3;
		for(k=1;k<=n;k++){
			scanf("%s%s%d",a,b,&t);
			for(i=1;i<=j;i++){
				if(strcmp(a,s[i])==0) break;
			}
			if(i>j) {
				x=j;
				strcpy(s[j],a);
				j++;
			}
			else x=i;
			for(i=1;i<=j;i++){
				if(strcmp(b,s[i])==0) break;
			}
			if(i>j) {
				y=j;
				strcpy(s[j],b);
				j++;
			}
			else y=i;
			if(map[x][y]>t){
				map[x][y]=map[y][x]=t;//重边 
			}
		}
	if(strcmp(s[1],s[2])==0) printf("0\n");//起点与终点相同 
	else{
		dijkstra(j);
		if(dis[2]!=inf)
		printf("%d\n",dis[2]);
		else printf("-1\n");
	}
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值