• 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
    ");
     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
    ");
     98             continue;
     99         }
    100         dijkstra(M[start]);
    101         if(node[M[end]]==INF)
    102             printf ("-1
    ");
    103         else
    104             printf ("%d
    ",node[M[end]]);
    105     }
    106     return 0;
    107 }
    View Code
  • 相关阅读:
    黑客书架上的书籍(转)
    vc 得到文件后缀名(转)
    配置IIS7(转)
    vs2008 目标框架 发布遇到的问题(转)
    CListCtrl用法(转)
    T400 折腾
    VS2008和.NET Framework3.5新功能(转)
    sql 2008 ctp 安装
    关于定位lsass内存中的明文密码(转)
    NT系统下木马进程的隐藏与检测(转)
  • 原文地址:https://www.cnblogs.com/qq-star/p/3908399.html
Copyright © 2020-2023  润新知