NYOJ115 城市平乱 【SPFA】

城市平乱

时间限制:1000 ms  |  内存限制:65535 KB

难度:4

描述

南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。

他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。

现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。

现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。

注意,两个城市之间可能不只一条路。

输入
第一行输入一个整数T,表示测试数据的组数。(T<20)

每组测试数据的第一行是四个整数N,M,P,Q(1<=N<=100,N<=M<=1000,M-1<=P<=100000)其中N表示部队数,M表示城市数,P表示城市之间的路的条数,Q表示发生暴乱的城市编号。

随后的一行是N个整数,表示部队所在城市的编号。

再之后的P行,每行有三个正整数,a,b,t(1<=a,b<=M,1<=t<=100),表示a,b之间的路如果行军需要用时为t

数据保证暴乱的城市是可达的。

输出
对于每组测试数据,输出第一支部队到达叛乱城市时的时间。每组输出占一行
样例输入
1
3 8 9 8
1 2 3
1 2 1
2 3 2
1 4 2
2 5 3
3 6 2
4 7 1
5 7 3
5 8 2
6 8 2 
样例输出
4
来源
《世界大学生程序设计竞赛高级教程·第一册》改编
上传者
张云聪

忘了是无向图,WA了好几次-_-|||

#include <stdio.h>
#include <string.h>
#include <queue>

#define maxn 1010
#define maxm 200010
#define inf 0x3f3f3f3f

int head[maxn];
struct Node {
    int v, dis, next;
} E[maxm];
bool vis[maxn];
int dist[maxn], tar[maxn];
int n, m, p, q, id;

void addEdge(int u, int v, int dis) {
    E[id].v = v; E[id].dis = dis;
    E[id].next = head[u]; head[u] = id++;
}

void getMap() {
    scanf("%d%d%d%d", &n, &m, &p, &q);
    int i, u, v, dis; id = 0;
    memset(head, -1, sizeof(int) * (m + 1));
    for(i = 0; i < n; ++i)
        scanf("%d", &tar[i]);
    while(p--) {
        scanf("%d%d%d", &u, &v, &dis);
        addEdge(u, v, dis);
        addEdge(v, u, dis);
    }
}

void SPFA() {
    std::queue<int> Q;
    memset(dist, 0x3f, sizeof(int) * (m + 1));
    memset(vis, 0, sizeof(bool) * (m + 1));
    dist[q] = 0; vis[q] = 1; Q.push(q);
    int u, v, i;
    while(!Q.empty()) {
        u = Q.front(); Q.pop(); vis[u] = 0;
        for(i = head[u]; i != -1; i = E[i].next) {
            if(dist[v = E[i].v] > dist[u] + E[i].dis) {
                dist[v] = dist[u] + E[i].dis;
                if(!vis[v]) {
                    vis[v] = 1; Q.push(v);
                }
            }
        }
    }
}

void solve() {
    SPFA();
    int ans = inf;
    for(int i = 0; i < n; ++i)
        if(ans > dist[tar[i]])
            ans = dist[tar[i]];
    printf("%d\n", ans);
}

int main() {
    // freopen("stdin.txt", "r", stdin);
    int t;
    scanf("%d", &t);
    while(t--) {
        getMap();
        solve();
    }
    return 0;
}
时间: 2024-10-16 05:55:19

NYOJ115 城市平乱 【SPFA】的相关文章

NYOJ 115 城市平乱

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

nyist oj 115 城市平乱 (最短路径)

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

nyoj 115 城市平乱(dijkstra)

城市平乱 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路. 输入 第一行输入一个整数T,表示测试数据的组数.(T<20)每组测试数

城市平乱(南阳oj115)(迪杰斯特拉算法)

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

NYOJ 115 城市平乱(Dijkstra入门)

链接:click here 题意: 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市.他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M.现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱.现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 思路:最短路问题入门题:出的数据比较水,看到别人都是用优先队列的Dijkstra实现, 效率

NYOJ 城市平乱

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

nyoj 115 城市平乱 【BFS】

题意:中文题,不解释 策略:广搜.第一道广搜题,先从目标点开始,进队列,标记此节点已被找过,以对首为起始点再找与它相连(并且没有被标记的)的结点入队尾,删除队首,然后在以此时的队首为起始点,标记此节点已被找过, 找与它相邻的点(并且没有被标记的),删除队首,一直循环直至所有节点都被找完. 代码: #include<stdio.h> #include<string.h> #include<queue> #define MAXN 0x3f3f3f3f using std::

nyoj 城市平乱(Dijkstra)

裸 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #include<climits&g

NYOJ115 市叛乱 【SPFA】

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 如今,小工军师告诉南将军.第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿近期路去往暴乱城市平乱. 如今已知在随意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序猿,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不仅仅一