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;
}
View Code

 










以上是关于FZU - 2261 浪里个浪 SPFA最短路的主要内容,如果未能解决你的问题,请参考以下文章

[FZU2261]浪里个浪

FOJ Problem 2261 浪里个浪

发现了两个神奇的网站!边做试验边学编程!

AcWing 851. spfa求最短路(解决负边权最短路)

最短路 P1144 最短路计数Dijkstra堆优化/SPFA

最短路 P1144 最短路计数Dijkstra堆优化/SPFA