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;
} 


你可能感兴趣的:(字符串,dijkstra)