zoukankan      html  css  js  c++  java
  • 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
    ", ans);
    }
    
    int main() {
        // freopen("stdin.txt", "r", stdin);
        int t;
        scanf("%d", &t);
        while(t--) {
            getMap();
            solve();
        }
        return 0;
    }


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    Makefile 使用总结(转)
    linux,pthread(转)
    Java中this和super的用法总结
    「转」开发十年,只剩下这套Java开发体系了
    js的function立即执行函数
    什么是回调函数
    算法总结:双指针法的常见应用
    26. Remove Duplicates from Sorted Array
    1. Two Sum
    Spring的依赖注入和控制反转
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4636485.html
Copyright © 2011-2022 走看看