标签:
HDU Today――全剧终――
这题还是利用迪杰斯特拉定理
不过要注意几个地方 1:起点==终点 dist=0;
2)重边
//由于点有字符串构成所以利用二维字符串 字符与数字对应,没输入顶点的权的时候判断前面是否出现过
//相同的顶点 如果没有的话新增一个
#include <stdio.h> #include <string.h> #define inf 0x3f3f3f int c[200][200]; int dist[200]; void dijs(int v,int n) { bool s[200]; for(int i=1;i<=n;i++) { dist[i]=c[v][i]; s[i]=0; } s[v]=1; dist[v]=0; for(int i=2;i<=n;i++) { int temp=inf; int u=v; for(int k=1;k<=n;k++) { if(!s[k]&&dist[k]<temp) { temp=dist[k]; u=k; } } s[u]=1; for(int k=1;k<=n;k++) { if(!s[k]&&dist[k]>dist[u]+c[u][k]) dist[k]=dist[u]+c[u][k]; } } } int main() { int n; while(~scanf("%d",&n)) { if(n==-1) break; for(int i=1;i<=200;i++) { for(int k=1;k<=200;k++) { c[i][k]=inf; if(i==k) c[i][k]=0; } dist[i]=inf; } int cnt=2,len; char s[200][31],s1[31],s2[31]; scanf("%s%s",s[1],s[2]); if(strcmp(s[1],s[2])==0) //开始跟结束相同距离为0 { c[1][2]=0; c[2][1]=0; } for(int i=0;i<n;i++) { scanf("%s%s%d",s1,s2,&len); int b=0,b1=0; for(int k=1;k<=cnt;k++) { if(strcmp(s[k],s1)==0) //判断前面是否出现过 b=k; if(strcmp(s[k],s2)==0) b1=k; } if(b==0) //如果没出现过的顶点话 { strcpy(s[++cnt],s1); //新增一个 b=cnt; } if(b1==0) { strcpy(s[++cnt],s2); b1=cnt; } if(len<c[b][b1]) { c[b][b1]=len; c[b1][b]=len; } } dijs(1,cnt); if(dist[2]!=inf) printf("%d\n",dist[2]); else printf("-1\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/a73265/article/details/46330405