hdu 2112 HDU Today (最短路)

来源:互联网 发布:淘宝背景音乐推荐 编辑:程序博客网 时间:2024/05/21 00:47
题目链接: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         else104             printf ("%d\n",node[M[end]]);105     }106     return 0;107 }
View Code

 

0 0
原创粉丝点击