zoukankan      html  css  js  c++  java
  • HDU 2544(简单最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=2544

     1 /*
     2 使用pair代替结构
     3 */
     4 
     5 #include <iostream>
     6 #include <cstdio>
     7 #include <queue>
     8 #include <vector>
     9 using namespace std;
    10 const int Ni = 10000;
    11 const int INF = 1<<27;
    12 
    13 typedef pair<int,int> pa;
    14 
    15 int dis[Ni],n;//dis使用1-n的部分
    16 
    17 vector<pair<int,int> > eg[Ni];
    18 
    19 void Dijkstra(int s)
    20 {
    21           int i,j;
    22           for(i=0;i<=n;i++)//要到n
    23                     dis[i] = INF;
    24           priority_queue<pa> q;  //优先级队列:小顶堆
    25           dis[s] = 0;
    26           q.push(make_pair(s,dis[s]));
    27 
    28           while(!q.empty())
    29           {
    30                     pa x = q.top();
    31                     q.pop();
    32                     int w = x.first;
    33                     for(j = 0;j<eg[w].size();j++)//遍历x的所有邻接点
    34                     {
    35                               pa y = eg[w][j];//y是x的邻接点
    36                               int u = y.first;
    37                               if(dis[u]>x.second+y.second)
    38                               {
    39                                         dis[u] = x.second+y.second;
    40                                         q.push(make_pair(u,dis[u]));
    41                               }
    42                     }
    43           }
    44 
    45 }
    46 
    47 
    48 int main()
    49 {
    50           int m,a,b,d;//关系个数
    51           while(cin>>n>>m,m+n)
    52           {
    53                     for(int i = 0;i<=n;i++)
    54                               eg[i].clear();//初始化
    55                     while(m--)
    56                     {
    57                               cin>>a>>b>>d;
    58                               eg[a].push_back(make_pair(b,d));
    59                               eg[b].push_back(make_pair(a,d));
    60                     }
    61 
    62                     Dijkstra(1);
    63                     if(dis[n]!=INF)
    64                               cout<<dis[n]<<endl;
    65                     else
    66                               cout<<"-1
    ";
    67           }
    68 
    69           return 0;
    70 }

    同换C,从62到了15MS

    要注意下标

     1 #include <cstdio>
     2 using namespace std;
     3 const int L = 1010;
     4 const int INF = 1<<27;
     5 
     6 int map[L][L];
     7 int vis[L];
     8 int dis[L];
     9 
    10 int n,m;
    11 
    12 void Dijkstra(int s)
    13 {
    14           int i,j,k;
    15           int min;
    16           for(i = 0;i<=n;i++)
    17           {
    18                     dis[i] = map[s][i];
    19                     vis[i] = 0;
    20           }
    21 
    22           vis[s] = 1;
    23           dis[s] = 0;
    24 
    25           for(i = 0;i<=n;i++)
    26           {
    27                     min = INF;
    28                     for(j = 0;j<=n;j++)
    29                     {
    30                               if(dis[j]<min && !vis[j])
    31                               {
    32                                         k = j;
    33                                         min = dis[j];
    34                               }
    35                     }
    36 
    37                     vis[k] = 1;
    38 
    39                     for(j = 0;j<=n;j++)
    40                     {
    41                               if(dis[j] > min+map[k][j] && !vis[j])
    42                               {
    43                                         dis[j] = min+map[k][j];
    44                               }
    45                     }
    46           }
    47 }
    48 
    49 void init()
    50 {
    51           int i,j;
    52           for(i = 0;i<=n;i++)
    53           {
    54                     map[i][i] = 0;
    55                     for(j = i+1;j<=n;j++)
    56                     {
    57                               map[i][j] = map[j][i] = INF;
    58                     }
    59           }
    60 
    61           while(m--)
    62           {
    63                     int a,b,w;
    64                     scanf("%d%d%d",&a,&b,&w);
    65                     if(w<map[a][b])//可能有同两点,但不同weight
    66                     {
    67                               map[a][b] = w;
    68                               map[b][a] = w;
    69                     }
    70           }
    71 }
    72 
    73 
    74 int main()
    75 {
    76           while(scanf("%d%d",&n,&m),n+m)
    77           {
    78                     int r,t;
    79 
    80                     init();
    81 
    82 
    83                     Dijkstra(1);
    84 
    85                     if(dis[n]!=INF)
    86                               printf("%d
    ",dis[n]);
    87                     else
    88                               printf("-1
    ");
    89 
    90           }
    91 
    92           return 0;
    93 }
  • 相关阅读:
    flask + supervisor + gunicorn
    sqlacodegen 的使用
    centos 安装 postgresql
    zipfile 压缩文件
    jmeter跨线程调用和线程内调用
    获取时间
    ant+jmeter环境配置
    Jenkins环境部署
    jmeter分布式性能测试部署
    怎么在Windows Server服务器上发布jsp网站
  • 原文地址:https://www.cnblogs.com/qlky/p/5015759.html
Copyright © 2011-2022 走看看