• Dijkstra+二叉堆优化


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <math.h>
      4 #include <string.h>
      5 #define MAXC 501
      6 #define MAXN 801 
      7 #define MAXM 1451 * 2
      8 #define INF 0x7FFFFFFF
      9 using namespace std;
     10 struct edge
     11 {
     12     edge *next;
     13     int t, v;
     14 } ES[MAXM];
     15 struct HeapElement
     16 {
     17     int key, value;
     18 };
     19 struct MinHeap
     20 {
     21     HeapElement H[MAXN];
     22     int size;
     23     int Position[MAXN];
     24     void init()
     25     {
     26         H[size = 0].value = -INF;
     27     }
     28     void ins(int key, int value)
     29     {
     30         int f;
     31         HeapElement p = {key, value};
     32         for (int i = ++size; p.value < H[f = i >> 1].value; i=f)
     33         {
     34             H[i] = H[f];
     35             Position[H[i].key] = i;
     36         }
     37         H[i] = p;
     38         Position[H[i].key] = i;
     39     }
     40     void decrease(int key, int value)
     41     {
     42         int f;
     43         HeapElement p = {key, value};
     44         for (int i = Position[key]; p.value < H[f = i >> 1].value; i=f)
     45         {
     46             H[i] = H[f];
     47             Position[H[i].key] = i;
     48         }
     49         H[i] = p;
     50         Position[H[i].key] = i;
     51     }
     52     void delmin()
     53     {
     54         int c;
     55         HeapElement p = H[size--];
     56         for (int i = 1; (c = i << 1) <= size; i=c)
     57         {
     58             if (c + 1 <= size && H[c + 1].value < H[c].value)
     59                 ++c;
     60             if (H[c].value < p.value)
     61             {
     62                 H[i] = H[c];
     63                 Position[H[i].key] = i;
     64             }
     65             else
     66                 break;
     67         }
     68         H[i] = p;
     69         Position[H[i].key] = i;
     70     }
     71 } H;
     72 int N, M, C, EC = -1, Ans = INF;
     73 int Cow[MAXC], sp[MAXN];
     74 edge *V[MAXN];
     75 inline void addedge(int a, int b, int c)
     76 {
     77     ES[++EC].next = V[a];
     78     ES[EC].t = b;
     79     ES[EC].v = c;
     80     V[a] = &ES[EC];
     81 }
     82 void init()
     83 {
     84     int a, b, c;
     85     scanf("%d %d %d", &C, &N, &M);
     86     for (int i = 1; i <= C; ++i)
     87         scanf("%d", &Cow[i]);
     88     for (int i = 1; i <= M; ++i)
     89     {
     90         scanf("%d %d %d", &a, &b, &c);
     91         addedge(a, b, c);
     92         addedge(b, a, c);
     93     }
     94 }
     95 void Dijkstra(int S)
     96 {
     97     sp[S] = 0;
     98     H.decrease(S, 0);
     99     for (int i = S, j; ; )
    100     {
    101         H.delmin();
    102         for (edge *k = V[i]; k; k = k -> next)
    103         {
    104             if (sp[i] + k -> v < sp[j = k -> t])
    105             {
    106                 sp[j] = sp[i] + k -> v;
    107                 H.decrease(j, sp[j]);
    108             }
    109         }
    110         if (H.size)
    111             i = H.H[1].key;
    112         else
    113             break;
    114     }
    115 }
    116 void solve()
    117 {
    118     int Total;
    119     for (int i = 1, j; i <= N; ++i)
    120     {
    121         H.init();
    122         for (j = 1; j <= N; ++j)
    123         {
    124             H.ins(j, INF);
    125             sp[j] = INF;
    126         }
    127         Total = 0;
    128         Dijkstra(i);
    129         for (j = 1; j <= C; ++j)
    130             Total += sp[Cow[j]];
    131         if (Total < Ans)
    132             Ans = Total;
    133     }
    134 }
    135 int main()
    136 {
    137     init();
    138     solve();
    139     printf("%d\n", Ans);
    140     return 0;
    141 }
  • 相关阅读:
    Basic INFO InstallShield的版本区分
    月光博客 从软件保护到软件授权
    Basic INFO InstallShield Professional for AdminStudio版本中如何打开InstallScript工程类型
    Basic INFO InstallScript脚本编程的限制
    从软件加密到软件授权保护
    月光博客 再谈软件保护中软加密和硬加密的安全强度
    INFO:Visual Studio 11 Beta版本中去除对Visual Studio Installer的支持,只保留InstallShield LE版本
    android 抓包分析
    android 巧用 dimerns 分辨率
    android 抓包 2
  • 原文地址:https://www.cnblogs.com/hatsuakiratenan/p/3132478.html
Copyright © 2020-2023  润新知