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>
 11 #include<string.h>
 12 #include<cmath>
 13 #include<stdlib.h>
 14 #include<vector>
 15 #include<stack>
 16 #include<set>
 17 using namespace std;
 18 #define INF 1000000007
 19 #define MAXN 2010
 20 #define Mod 1000007
 21 #define N 100010
 22 #define NN 30
 23 #define sigma_size 3
 24 const int MAX = 1000100;
 25 const int maxn = 6e5 + 10;
 26 using namespace std;
 27 typedef long long LL;
 28
 29 bool vis[1010];
 30 int G[1010][1010];
 31 int army[1100];
 32 int dist[1010];
 33 int n, m, p, q;
 34 int u, v, w, tmp;
 35
 36 void Dijkstra(int src)
 37 {
 38     int min, pos;
 39     for (int i = 1; i <= m; ++i)
 40         dist[i] = G[src][i];
 41     dist[src] = 0;
 42     vis[src] = true;
 43     for (int i = 1; i <= m; ++i) {
 44         min = MAX;
 45         for (int j = 1; j <= m; ++j) {
 46             if (dist[j] < min && !vis[j]) {
 47                 min = dist[j];
 48                 pos = j;
 49             }
 50         }
 51         if (min == MAX) return;
 52         vis[pos] = true;
 53         for (int j = 1; j <= m; ++j){
 54             if (!vis[j] && dist[pos] + G[pos][j] < dist[j]) {
 55                 dist[j] = dist[pos] + G[pos][j];
 56             }
 57         }
 58     }
 59 }
 60
 61 void run()
 62 {
 63     scanf("%d%d%d%d", &n, &m, &p, &q);
 64     memset(army,0,sizeof(army));
 65     memset(vis,0,sizeof(vis));
 66     memset(dist,0,sizeof(dist));
 67     for (int i = 0; i <= m; ++i) {
 68         for (int j = 0; j <= m; ++j) {
 69             G[i][j] = G[j][i] = MAX;
 70         }
 71     }
 72     for (int i = 0; i < n; ++i) {
 73         scanf("%d", &tmp);
 74         army[tmp] = 1;
 75     }
 76     for (int i = 1; i <= p; ++i) {
 77         scanf("%d%d%d", &u, &v, &w);
 78         if (G[u][v] > w) G[u][v] = G[v][u] = w;
 79     }
 80     Dijkstra(q);
 81     /*for (int i = 1; i <= m; ++i)
 82         cout << dist[i] << " ";
 83     cout << endl;*/
 84     int mmax = MAX;
 85     for (int i = 1; i <= m; ++i) {
 86         if (mmax > dist[i] && army[i])
 87             mmax = dist[i];
 88     }
 89     printf("%d\n",mmax);
 90     //system("pause");
 91 }
 92
 93 int main()
 94 {
 95     int T;
 96     scanf("%d",&T);
 97     while (T--)
 98         run();
 99     return 0;
100 }
时间: 2024-08-01 10:32:58

nyoj 城市平乱(Dijkstra)的相关文章

nyoj 115 城市平乱(dijkstra)

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

NYOJ 城市平乱

城市平乱 时间限制: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 115 城市平乱

城市平乱 时间限制: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::

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

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

NYOJ115 城市平乱 【SPFA】

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

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

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

nyoj 115------城市平乱( dijkstra // bellman )

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