HDU

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112

Sample Input
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
 

Sample Output
50


Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake

题意:

求最短路,要注意的是顶点名称都换成了字符串,要重新标记,还有就是起点和终点重合的情况需要考虑。

*:使用map函数可以将字符串转化为整数存储。

map<string,int>mymap;

mymap[string]=int;

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stack>
  6 #include<math.h>
  7 #include<queue>
  8 #include<map>
  9 using namespace std;
 10 
 11 ///map可以理解为一个一对一的key,value对,也叫做键值对
 12 ///通常用于快速寻找一个key的对应的value是多少
 13 ///map<key,value>mymap; mymap[key]=value;
 14 
 15 #define INF 0x3f3f3f3f
 16 #define N 12342
 17 
 18 int n;
 19 int s[200][200];
 20 int p[200],t[200];
 21 
 22 void Dij(int e,int f)
 23 {
 24    memset(p,0,sizeof(p));
 25 
 26     for(int i=1;i<=f;i++)
 27         t[i]=(i==e?0:INF);
 28 
 29     for(int i=1;i<=f;i++)
 30     {
 31         int Min=INF,w;
 32 
 33         for(int j=1;j<=f;j++)
 34             if(!p[j]&&t[j]<Min)
 35             {
 36                  w=j;
 37                  Min=t[j];
 38             }
 39         p[w]=1;
 40         if(Min==INF) break;
 41 
 42         for(int j=1;j<=f;j++)
 43         {
 44             if(!p[j]&&t[w]+s[w][j]<t[j])
 45             t[j]=t[w]+s[w][j];
 46         }
 47     }
 48 }
 49 
 50 int main()
 51 {
 52     int flag,len;
 53 
 54     map<string,int> mymap;///将字符串化为整数存储,然后进行Dij
 55     char s1[100],s2[100];
 56 
 57     while(scanf("%d", &n))
 58     {
 59         if(n==-1) break;
 60         mymap.clear();///mymap清零
 61 
 62         memset(s,INF,sizeof(s));
 63         flag=0;
 64 
 65         scanf("%s%s", s1,s2);
 66 
 67         ///strcmp用于比较两个字符串
 68         ///s1<s2,返回负数;s1==s2,返回0;s1>s2,返回正数
 69         if(strcmp(s1,s2)==0)
 70             flag=1;
 71 
 72         mymap[s1]=1;
 73         mymap[s2]=2;
 74         int cnt=3;
 75 
 76        /// printf("%d %d
", s[1][2], s[6][6]);
 77 
 78         for(int i=0; i<n; i++)
 79         {
 80             scanf("%s%s%d", s1,s2,&len);
 81 
 82             if(mymap[s1]==0)
 83                 mymap[s1]=cnt++;
 84             if(mymap[s2]==0)
 85                 mymap[s2]=cnt++;
 86             s[mymap[s1]][mymap[s2]]= s[mymap[s2]][mymap[s1]]=min(len, s[mymap[s1]][mymap[s2]]);
 87 
 88             ///printf("%d %d %d
", mymap[s1],mymap[s2],len);
 89         }
 90 
 91         if(flag)
 92         {
 93             printf("0
");
 94             continue;
 95         }
 96 
 97         Dij(1,cnt);
 98 
 99         printf("%d
", t[2]==INF?-1:t[2]);
100     }
101     return 0;
102 }

本人博客:http://www.cnblogs.com/weiyuan/

原文地址:https://www.cnblogs.com/weiyuan/p/5680011.html