[原]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 查看评论
原文地址:https://www.cnblogs.com/ZiningTang/p/3834758.html