• 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
    ",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 }
  • 相关阅读:
    9"边界匹配
    8劈分
    7替换
    5逻辑匹配
    4分组匹配
    3贪婪匹配与勉强匹配
    python多线程之线程传参
    多线程(类的形式)---线程同步
    多线程基础
    Linux----黑马程序员Linux教学视频简记(转载)
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4333752.html
Copyright © 2020-2023  润新知