• BZOJ3624 [Apio2008]免费道路


    就是贪心的想法。。。先取1的再取0的边

    验证一下满不满足要求以后,再做一遍生成树。

    反正Kruskal是O(m)的无压力2333

     1 /**************************************************************
     2     Problem: 3624
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:60 ms
     7     Memory:16416 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11  
    12 using namespace std;
    13 const int N = 20005;
    14 const int M = 100005;
    15 const int Maxlen = 15000010;
    16  
    17 struct edges {
    18     int x, y;
    19     edges() {}
    20     edges(int _x, int _y) : x(_x), y(_y) {}
    21 }e[M];
    22  
    23 int n, m, k, cnt;
    24 int fa[N];
    25 bool vis[M];
    26  
    27 char buf[Maxlen];
    28 int Len, Left;
    29  
    30 inline int read() {
    31     int x = 0;
    32     while (buf[Left] < '0' || '9' < buf[Left]) ++Left;
    33     while ('0' <= buf[Left] && buf[Left] <= '9')
    34         x = x * 10 + buf[Left++] - '0';
    35     return x;
    36 }
    37    
    38 int len = 0, pr[15];
    39 inline void print(int x) {
    40     if (x < 0) putchar('-'), x = -x;
    41     while (x)
    42         pr[++len] = x % 10, x /= 10;
    43     if (!len) putchar('0');
    44     while (len)
    45         putchar(pr[len--] + '0');
    46 }
    47  
    48  
    49 int find_fa(int x) {
    50     return fa[x] == x ? x : fa[x] = find_fa(fa[x]);
    51 }
    52  
    53 int main() {
    54     int i, x, y, f, L, R, fa1, fa2;
    55     Len = fread(buf, 1, Maxlen, stdin);
    56     buf[Len] = ' ';
    57     n = read(), m = read(), k = read();
    58     for (i = 1, L = 0, R = m + 1; i <= m; ++i) {
    59         x = read(), y = read(), f = read();
    60         if (f) e[++L] = edges(x, y);
    61         else e[--R] = edges(x, y);
    62     }
    63      
    64     for (i = 1; i <= n; ++i) fa[i] = i;
    65     for (i = 1; i <= m; ++i)
    66         if ((fa1 = find_fa(e[i].x)) != (fa2 = find_fa(e[i].y))) {
    67             fa[fa1] = fa2;
    68             if (i > L)
    69                 vis[i] = 1, cnt += 1;
    70         }
    71     if (cnt > k) {
    72         puts("no solution");
    73         return 0;
    74     }
    75      
    76     for (i = 1; i <= n; ++i) fa[i] = i;
    77     for (i = R; i <= m; ++i)
    78         if (vis[i]) fa[find_fa(e[i].x)] = find_fa(e[i].y);
    79     for (i = R; i <= m; ++i)
    80         if (!vis[i] && cnt < k && (fa1 = find_fa(e[i].x)) != (fa2 = find_fa(e[i].y))) {
    81             fa[fa1] = fa2, vis[i] = 1;
    82             ++cnt;
    83         }
    84     if (cnt != k) {
    85         puts("no solution");
    86         return 0;
    87     }
    88      
    89     for (i = 1; i <= L; ++i)
    90         if ((fa1 = find_fa(e[i].x)) != (fa2 = find_fa(e[i].y)))
    91             fa[fa1] = fa2, vis[i] = 1;
    92     for (i = 1; i <= m; ++i)
    93         if (vis[i]) {
    94             print(e[i].x), putchar(' ');
    95             print(e[i].y), putchar(' ');
    96             print(i <= L), putchar('
    ');
    97         }
    98 }
    View Code

    (p.s. 用IO外挂骗了个Rank.1,液!)

    (p.s. 另:试了一下。。。putchar和putc差不多快,但是fputc和fwrite好慢。。。不知为何呢?)

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    所写既所思
    OO总结
    OO第三单元作业总结
    OO第二单元作业总结
    OO第一单元作业总结
    oo第四单元与课程总结
    oo第三单元总结——jml
    oo第二单元博客总结
    面向对象设计与构造-第一单元作业总结
    个人总结-不说再见
  • 原文地址:https://www.cnblogs.com/rausen/p/4114792.html
Copyright © 2020-2023  润新知