hdu 2112 HDU Today (最短路)

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

题目大意:给出起点和终点,然后算出最短的路。

不过有好多细节要注意:

(1)起始点和终止点相等的时候,这里注意不能直接输出0,必须用标记,因为数据可能还没有处理完!!!此处贡献n次wa。

(2)这里是某大神教我的用map进行转换,将字符串转换成数字,值得参考。map<string,int>M,V;不过这里同样是wa了好多次。要注意的是将最先输入的开始和结束的点也要放到这个map里面。

(3)再就是注意的dijkstra这个算法的应用了。

祝大家好运~wa了14次的我眼泪掉下来。。。。。

  1 #include <iostream>

  2 #include <cstdio>

  3 #include <map>

  4 #include <cstring>

  5 #include <algorithm>

  6 using namespace std;

  7 #define INF 9999999

  8 int k,Map[155][155],node[155];

  9 map<string,int>M,V;

 10 

 11 void set()

 12 {

 13     for (int i=0; i<155; i++)

 14     {

 15         node[i]=INF;

 16         for (int j=0; j<155; j++)

 17         {

 18             if (i!=j)

 19                 Map[i][j]=INF;

 20             else

 21                 Map[i][j]=0;

 22         }

 23     }

 24 }

 25 

 26 void dijkstra(int m)

 27 {

 28     int vis[155]= {0};

 29     int tm=m;

 30     vis[m]=1;

 31     node[m]=0;

 32     for (int j=1; j<k; j++)

 33     {

 34         int Min=INF;

 35         for (int i=0; i<k; i++)

 36             if (!vis[i])

 37             {

 38                 if (node[i]>node[tm]+Map[tm][i])

 39                     node[i]=node[tm]+Map[tm][i];

 40                 if (Min>node[i])

 41                 {

 42                     Min=node[i];

 43                     m=i;

 44                 }

 45                 //cout<<i<<" "<<node[i]<<" "<<Map[tm][i]<<endl;

 46             }

 47         vis[m]=1;

 48         tm=m;

 49     }

 50 }

 51 

 52 int main()

 53 {

 54     bool flag;

 55     int t,n;

 56     while (scanf("%d",&n),n!=-1)

 57     {

 58         flag=0;

 59         M.clear();

 60         V.clear();

 61         set();

 62         //memset(Map,INF,sizeof(Map));

 63         char start[135],end[135],s[135],e[135];

 64         k=2;

 65         scanf("%s%s",start,end);

 66         if (strcmp(start,end)==0)

 67             flag=1;

 68         if(n==0)

 69         {

 70             printf("-1\n");

 71             continue;

 72         }

 73         M[start]=0;

 74         M[end]=1;

 75         while (n--)

 76         {

 77             scanf("%s%s%d",s,e,&t);

 78             if(!V[s])

 79             {

 80                 V[s]=1;

 81                 M[s]=k++;

 82                 //cout<<k<<endl;

 83             }

 84             if(!V[e])

 85             {

 86                 V[e]=1;

 87                 M[e]=k++;

 88                 //cout<<k<<endl;

 89             }

 90             if (Map[M[s]][M[e]]>t)

 91                 Map[M[s]][M[e]]=Map[M[e]][M[s]]=t;

 92         }

 93         //set();

 94         //cout<<k<<endl;

 95         if (flag)

 96         {

 97             printf ("0\n");

 98             continue;

 99         }

100         dijkstra(M[start]);

101         if(node[M[end]]==INF)

102             printf ("-1\n");

103         else

104             printf ("%d\n",node[M[end]]);

105     }

106     return 0;

107 }
View Code

 

你可能感兴趣的:(HDU)