FZU - 2261 浪里个浪 SPFA最短路
Posted Coder_L
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FZU - 2261 浪里个浪 SPFA最短路相关的知识,希望对你有一定的参考价值。
题目
TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划。
现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道。他已经预先规划好了一些点作为旅游的起点和终点,他想选择其中一个起点和一个终点,并找出从起点到终点的一条路线亲身体验浪的过程。但是他时间有限,所以想选择耗时最小的,你能告诉他最小的耗时是多少吗?
Input
包含多组测试数据。
输入第一行包括两个整数n和m,表示有n个地点,m条可行路径。点的编号为1 - n。
接下来m行每行包括三个整数i, j, cost,表示从地点i到地点j需要耗时cost。
接下来一行第一个数为S,表示可能的起点数,之后S个数,表示可能的起点。
接下来一行第一个数为E,表示可能的终点数,之后E个数,表示可能的终点。
0<S, E≤n≤100000,0<m≤100000,0<cost≤100。
Output
输出他需要的最短耗时。
Sample Input
4 4
1 3 1
1 4 2
2 3 3
2 4 4
2 1 2
2 3 4
Sample Output
1
多源最短路 ,SPFA算法实现
把每一个可能的起点的所有可能终点全部跑了一遍 ,居然没有TLE ,设初始minn为INF 然后每次查找后更新。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int maxn = 1e5+10; const int inf = 0x3f3f3f3f; int n,m,len; int first[maxn],vis[maxn],dis[maxn],s[maxn],t[maxn]; struct point { int u,v,w,next; }edge[maxn]; void add_edge(int u,int v,int w) { edge[len].v = v; edge[len].w = w; edge[len].next = first[u]; first[u] = len++; } void spfa(int start) { queue<int >q; for(int i=1;i<=n;i++){ dis[i] = inf; vis[i] = 0; } dis[start] = 0; vis[start] = 0; q.push(start); while(!q.empty()){ start = q.front(); q.pop(); vis[start] = 0; for(int i=first[start];i!=-1;i=edge[i].next){ int v = edge[i].v; int w = edge[i].w; if(dis[v]>dis[start]+w){ dis[v] = dis[start]+w; if(!vis[v]){ vis[v] =1; q.push(v); } } } } } int main() { int u,v,l; while(scanf("%d%d",&n,&m)!=EOF) { len = 1; memset(first,-1,sizeof(first)); for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&l); add_edge(u,v,l); } int a,b; scanf("%d",&a); for(int i=1;i<=a;i++){ scanf("%d",&s[i]); } scanf("%d",&b); for(int i=1;i<=b;i++){ scanf("%d",&t[i]); } int minn = inf; for(int i=1;i<=a;i++){ spfa(s[i]); for(int j=1;j<=b;j++){ minn = min(minn , dis[t[j]]); } } printf("%d\n",minn); } return 0; }
以上是关于FZU - 2261 浪里个浪 SPFA最短路的主要内容,如果未能解决你的问题,请参考以下文章
AcWing 851. spfa求最短路(解决负边权最短路)