题目大意: 已知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\n",Min); else cout<<"-1"<<endl; } return 0; }
作者:u011652573 发表于2014-3-6 0:18:03 原文链接
阅读:92 评论:0 查看评论