zoukankan      html  css  js  c++  java
  • [原]poj-2680-Choose the best route-dijkstra(基础最短路)

    题目大意: 已知n 个点,m条路线,s为终点;给出m条路线及其权值;给出w个起点,求最短路!

    思路:基础的dijkstra,有向无环正权最短路,只要把终点和起点 reverse考虑便可。

    AC代码如下:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    #define INF 1000000
    #define M 1010
    int n, m, s;
    int d[M];
    int w[M][M];
    int v[M];
    
    void dijkstra(int s)
    {
      memset(v,0,sizeof(v));
      memset(d,INF,sizeof(d));
      d[s] = 0;
      for(int i = 0; i < n; i++)
      {
        int x, m = INF;                //WA了半天找不到的bug,就是这里;开始忘了放在循环里了,ORZ。。。所以m会一直是0.。不WA才怪。
        for(int j = 1; j <= n; j++)
         if(!v[j]&&d[j] <= m) m = d[x = j];
        v[x] = 1;
    
        for(int j = 1; j <= n; j++)
          d[j] = d[j] < d[x] + w[x][j]? d[j]:d[x] + w[x][j];
    
      }
    }
    
    void init(int n)
    {
      for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
          w[i][j] = INF;
    }
    
    int main()
    {
      while(scanf("%d%d%d",&n, &m, &s) == 3)
      {
        init(n);
        for(int i = 0; i < m; i++)
        {
          int a,b,c;
          scanf("%d%d%d",&a,&b,&c);
          if(w[b][a] > c)
            w[b][a] = c;
        }
        dijkstra(s);
    
        int la,st,Min = INF;
        scanf("%d",&la);
    
        for(int i = 0; i < la; i++)
        {
          scanf("%d",&st);
          if(d[st] < Min) Min = d[st];
          //cout<<st<<"*"<<d[st]<<endl;
        }
        if(Min < INF)
         printf("%d
    ",Min);
        else
         cout<<"-1"<<endl;
      }
      return 0;
    
    }
    


    作者:u011652573 发表于2014-3-6 0:18:03 原文链接
    阅读:92 评论:0 查看评论
  • 相关阅读:
    【转载】Spring各jar包详解
    Docker attach卡着的解决
    三张图搞透第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的区别
    决策表
    因果图与决策表法
    边界值分析法
    黑盒测试方法
    软件测试的基本流程
    软件测试原则
    软件测试与软件开发
  • 原文地址:https://www.cnblogs.com/ZiningTang/p/3834758.html
Copyright © 2011-2022 走看看