本文主要是介绍hdu2680Choose the best route (spfa算法,加个以0点为起点到每个起点,只要一遍就能算出,不然要算k次),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Each case begins with three integers n, m and s,(n<1000,m<20000,1=<s<=n) n stands for the number of bus stations in this city and m stands for the number of directed ways between bus stations .(Maybe there are several ways between two bus stations .) s stands for the bus station that near Kiki’s friend’s home.
Then follow m lines ,each line contains three integers p , q , t (0<t<=1000). means from station p to station q there is a way and it will costs t minutes .
Then a line with an integer w(0<w<n), means the number of stations Kiki can take at the beginning. Then follows w integers stands for these stations.
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1加个0点,题目一下变简箪,省时。#include<stdio.h> #include<iostream> #include<queue> using namespace std; #define N 1005 #define INF 99999999 int map[N][N],node[N],n; void init() {for(int i=0;i<=n;i++){node[i]=INF;for(int j=0;j<=n;j++)map[i][j]=INF;} } void spfa(int s) {int inq[N]={0};queue<int>q;inq[s]=1; q.push(s);node[s]=0;while(!q.empty()){s=q.front();q.pop();inq[s]=0;for(int i=1;i<=n;i++)if(node[i]>map[s][i]+node[s]){node[i]=map[s][i]+node[s];if(inq[i]==0)inq[i]=1,q.push(i);}} } int main() {int m,end,k,p,q,t;while(scanf("%d%d%d",&n,&m,&end)>0){init();while(m--){scanf("%d%d%d",&p,&q,&t);if(map[p][q]>t)map[p][q]=t;}scanf("%d",&k);while(k--){scanf("%d",&p); map[0][p]=0;//这样0点与起点相连}spfa(0);printf("%d\n",node[end]!=INF?node[end]:(-1));} }
这篇关于hdu2680Choose the best route (spfa算法,加个以0点为起点到每个起点,只要一遍就能算出,不然要算k次)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!