zoukankan      html  css  js  c++  java
  • ZOJ 2849 Attack of Panda Virus (优先队列 priority_queue)

       优先队列,据说标程是并查集,没思路。貌似优先队列都是直接用stl写的,又逼我用stl了。prioriry_queue不熟。

    ps: value值越小,优先级越高。所以重载 < 运算符时按优先级从大到小排序

    bool operator < (const node a, const node b) {
    if(a.day != b.day) return a.day > b.day;
    return a.type > b.type;
    }

    参考网上的代码

    View Code
     1 #include <iostream>
    2 #include <cstdio>
    3 #include <cstring>
    4 #include <queue>
    5
    6 using namespace std;
    7
    8 const int N = 510;
    9 const int inf = ~0u>>2;
    10
    11 struct node {
    12 int x, y;
    13 int day;
    14 int type;
    15
    16 };
    17
    18 priority_queue<node> q;
    19
    20 int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
    21 int m, n;
    22 int mp[N][N];
    23 int list[N*N];
    24
    25 bool operator < (const node a, const node b) {
    26 if(a.day != b.day) return a.day > b.day;
    27 return a.type > b.type;
    28 }
    29
    30 bool insq(int x, int y) {
    31 if(x < 0 || x >= m || y < 0 || y >= n) return false;
    32 return true;
    33 }
    34
    35 void bfs() {
    36 node u, v;
    37 int d, i;
    38
    39 while(!q.empty()) {
    40 u = q.top(); q.pop();
    41
    42 d = -inf;
    43 v.day = u.day;
    44 v.type = u.type;
    45
    46 for(i = 0; i < 4; ++i) {
    47 v.x = u.x + dir[i][0];
    48 v.y = u.y + dir[i][1];
    49
    50 if(!insq(v.x, v.y) || mp[v.x][v.y] > 0) continue;
    51
    52 if(-1*mp[v.x][v.y] <= v.day) {
    53 mp[v.x][v.y] = v.type;
    54 list[v.type]++;
    55 q.push(v);
    56 } else if(mp[v.x][v.y] > d) {
    57 d = mp[v.x][v.y];
    58 }
    59 }
    60 if(d != -inf) {
    61 u.day = -1*d;
    62 q.push(u);
    63 }
    64 }
    65 }
    66
    67 int main() {
    68 freopen("data.in", "r", stdin);
    69
    70 int i, j, t;
    71 node p;
    72 while(~scanf("%d%d", &m, &n)) {
    73 memset(list, 0, sizeof(list));
    74
    75 for(i = 0; i < m; ++i) {
    76 for(j = 0; j < n; ++j) {
    77 scanf("%d", &mp[i][j]);
    78 if(mp[i][j] > 0) {
    79 p.x = i; p.y = j;
    80 p.day = 1; p.type = mp[i][j];
    81 list[p.type] ++;
    82 q.push(p);
    83 }
    84 }
    85 }
    86 bfs();
    87 scanf("%d", &t);
    88 while(t--) {
    89 scanf("%d", &i);
    90 printf("%d\n", list[i]);
    91 }
    92 }
    93 return 0;
    94 }




  • 相关阅读:
    android: 建立和断开a2dp link 相关方法总结
    Java: volatile和synchronized的区别 (转)
    shell 将变量当命令执行的几种方式
    tcp 自连接(主机的端口和自己建立连接)
    sed使用
    海尔风冷冰箱冷冻室最底层结冰 问题解决
    k8s 传参数的两种方式一种是 环境变量 拼接 另一种说是yaml传参到配置文件的表示怀疑要验证????????????????????????????
    k8s 集群中的etcd故障解决
    dockerfile
    使用VIM/VI给文件加密和解密
  • 原文地址:https://www.cnblogs.com/vongang/p/2429355.html
Copyright © 2011-2022 走看看