hdu2112-最短路(dijkstra)

来源:互联网 发布:5g网络什么时候出来的 编辑:程序博客网 时间:2024/04/28 07:38
//55070142012-03-09 19:10:33Accepted2112703MS312K1943 BG++zjwzcnjsy//无向图+重边//注意:n=0和s==e的情况#include <stdio.h>#include <string.h>#define inf 0x3fffffffint map[151][151];int n,t,k;char s[31];char e[31];char name[150][31];int search(char s[]){    for(int i=0;i<k;++i)        if(strcmp(s,name[i])==0)return i;    return -1;}int Dijkstra(int s){    int i,u,v[151],mins,min[151];    for(i=0;i<k;++i)min[i]=map[0][i],v[i]=0;    min[0]=0;    v[0]=1;    while(1)    {        mins=inf;        for(i=0;i<k;++i)        {            if(!v[i] && min[i]<mins)            {                mins=min[i];u=i;            }        }        if(u==1)return mins;        if(mins==inf)break;        v[u]=1;        for(i=0;i<k;++i)        {            if(!v[i] && min[u]+map[u][i]<min[i])            {                min[i]=min[u]+map[u][i];            }        }    }    //for(i=0;i<k;++i)     //   printf("-->%d\n",min[i]);    return min[1];}void dbg(){    int i,j;    for(i=0;i<k;++i)    {        for(j=0;j<k;++j)            printf("%10d",map[i][j]);        printf("\n");    }}int main(){    int i,j;    while(~scanf("%d",&n),n+1)    {        if(n==0){printf("-1\n");continue;}        k=0;        scanf("%s%s",name[0],name[1]);        k+=2;        for(i=0;i<151;i++)            for(j=0;j<151;++j)            {                map[i][j]=inf;                if(i==j)map[i][j]=0;            }        for(int i=0;i<n;++i)        {            scanf("%s%s%d",s,e,&t);            int ts=search(s);            if(ts==-1){strcpy(name[k],s);ts=k++;}            int te=search(e);            if(te==-1){strcpy(name[k],e);te=k++;}            if(map[ts][te]>t)map[te][ts]=map[ts][te]=t;        }       // dbg();        if(strcmp(name[0],name[1])==0){printf("0\n");continue;}        int ans=Dijkstra(0);        if(ans==inf)printf("-1\n");        else printf("%d\n",ans);    }    return 0;}

原创粉丝点击