• hdu 3832 即dijkstra新模板


      1 // hdu 3832
    2 #include <iostream>
    3 #include <cstring>
    4 #include <queue>
    5 #include <algorithm>
    6 using namespace std;
    7
    8 /////二维数组建边
    9 #define maxn 205
    10 #define MP make_pair
    11 const int inf=0x3f3f3f3f;
    12
    13 int N; //N顶点数
    14 int dist[maxn][maxn],mp[maxn][maxn];
    15 void dijstra(int s)
    16 {
    17 typedef pair<int,int> pii;
    18 priority_queue<pii, vector<pii>, greater<pii > > que;
    19 dist[s][s]=0;
    20 que.push(MP(0,s));
    21 int d, v;
    22 pair<int,int> tmp;
    23 while(!que.empty())
    24 {
    25 tmp=que.top();
    26 que.pop();
    27 d = tmp.first, v = tmp.second;
    28 if(d > dist[s][v])
    29 continue;
    30 for(int i=0; i<N; ++i)
    31 if(dist[s][i]>dist[s][v]+mp[v][i])
    32 {
    33 dist[s][i]=dist[s][v]+mp[v][i];
    34 que.push(MP(dist[s][i],i));
    35 }
    36 }
    37 }
    38
    39 void init()
    40 {
    41 memset(mp, 0x1f, sizeof(mp));
    42 memset(dist, 0x1f, sizeof(dist));
    43 }
    44
    45 ////////
    46
    47 /////vector建边
    48 #ifdef _no
    49
    50 const int inf=(1LL<<30);
    51 #define MP make_pair
    52
    53 vector<pii> mp[MAXN];
    54 inline void add_edge(int u,int v, lld cost){
    55 mp[u].push_back(MP(v, cost));
    56 mp[v].push_back(MP(u, cost));
    57 }
    58
    59 int N; //N顶点数
    60 vector<lld> dist;
    61 void dijstra(int s)
    62 {
    63 dist.assign(N+1, inf);
    64 typedef pair<int,int> pii;
    65 priority_queue<pii, vector<pii>, greater<pii> > que;
    66 dist[s]=0;
    67 que.push(MP(0,s));
    68 while(!que.empty())
    69 {
    70 pii tmp=que.top();
    71 que.pop();
    72 int vv = tmp.second;
    73 int d = tmp.first;
    74 if(d > dist[vv])
    75 continue;
    76 for(int i=0; i<mp[vv].size(); ++i)
    77 {
    78 int v2 = mp[vv][i].first;
    79 lld tx = mp[vv][i].second;
    80 if(dist[v2]>dist[vv]+tx)
    81 {
    82 dist[v2]=dist[vv]+tx;
    83 que.push(MP(dist[v2],v2));
    84 }
    85 }
    86 }
    87 }
    88
    89 void init()
    90 {
    91 for(int i=0; i<=N; ++i)
    92 mp[i].clear();
    93 }
    94 /////*/
    95 #endif
    96
    97 struct circle{
    98 int x, y, rad;
    99 } code[205];
    100
    101 bool judge(circle a, circle b)
    102 {
    103 int tmp = (b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y);
    104 if(tmp <= (a.rad+b.rad)*(a.rad+b.rad))
    105 return true;
    106 else
    107 return false;
    108 }
    109
    110 int main()
    111 {
    112 int T;
    113 scanf("%d", &T);
    114 while(T--)
    115 {
    116 scanf("%d", &N);
    117 init();
    118 for(int i=0; i<N; ++i)
    119 scanf("%d %d %d", &code[i].x, &code[i].y, &code[i].rad);
    120 for(int i=0; i<N; ++i)
    121 for(int j=0; j<N; ++j)
    122 if(judge(code[i], code[j]))
    123 mp[i][j] = 1;
    124 dijstra(0);
    125 dijstra(1);
    126 dijstra(2);
    127 int res = inf;
    128 for(int i=0; i<N; ++i)
    129 {
    130 res = min(res, dist[0][i]+dist[1][i]+dist[2][i]);
    131 }
    132 if(res > 10000 || res<2)
    133 printf("-1\n");
    134 else
    135 printf("%d\n", N-res-1);
    136 }
    137 }
  • 相关阅读:
    连通块问题
    线性数据结构
    NOIP2018总结
    原码反码补码详解
    一些常用的算法技巧总结
    骗分导论
    模板
    模板
    AcWing
    AcWing
  • 原文地址:https://www.cnblogs.com/kirk/p/2115614.html
Copyright © 2020-2023  润新知