zoukankan      html  css  js  c++  java
  • P2765-魔术球问题

      1 #include<bits/stdc++.h>
      2 #define _for(i,a,b) for(register int i = (a);i < b;i ++)
      3 #define _rep(i,a,b) for(register int i = (a);i > b;i --)
      4 #define INF 0x3f3f3f3f
      5 #define MOD 100000000
      6 #define maxn 100003
      7 #define pb push_back
      8 #define debug() printf("Miku Check OK!
    ")
      9 typedef long long ll;
     10 
     11 using namespace std;
     12 typedef pair<int,int> P;
     13 inline ll read()
     14 {
     15     ll ans = 0;
     16     char ch = getchar(), last = ' ';
     17     while(!isdigit(ch)) last = ch, ch = getchar();
     18     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
     19     if(last == '-') ans = -ans;
     20     return ans;
     21 }
     22 inline void write(ll x)
     23 {
     24     if(x < 0) x = -x, putchar('-');
     25     if(x >= 10) write(x / 10);
     26     putchar(x % 10 + '0');
     27 }
     28 int ver[maxn],Next[maxn],head[maxn],val[maxn];
     29 int d[maxn];
     30 int pillars,s,t,tot,maxflow;
     31 const int N = 3000;
     32 void add(int x,int y,int w)
     33 {
     34     ver[++tot] = y,Next[tot] = head[x],head[x] = tot,val[tot] = w;
     35 }
     36 bool bfs()
     37 {
     38     memset(d,0,sizeof(d));
     39     queue<int> q;
     40     q.push(s);
     41     d[s] = 1;
     42     while(!q.empty())
     43     {
     44         int x = q.front();
     45         q.pop();
     46         for(int i = head[x]; i; i = Next[i])
     47             if(val[i] && !d[ver[i]])
     48             {
     49                 q.push(ver[i]);
     50                 d[ver[i]] = d[x]+1;
     51                 if(ver[i]==t)
     52                     return true;
     53             }
     54     }
     55     return false;
     56 }
     57 int dinic(int x,int flow)
     58 {
     59     if(x==t) return flow;
     60     // k为子节点增量
     61     int rest = flow, k;
     62     for(int i = head[x]; i && rest; i = Next[i])
     63     {
     64         if(val[i] && d[ver[i]] == d[x]+1)
     65         {
     66             k = dinic(ver[i],min(rest,val[i]));
     67             if(!k) d[ver[i]] = 0;
     68             val[i] -= k;
     69             val[i^1] += k;
     70             rest -= k;
     71         }
     72     }
     73     return flow - rest;
     74 }
     75 vector<int> st;
     76 int vvis[maxn];
     77 void go(int i,vector<int>& rnt)
     78 {
     79     rnt.pb(i);
     80     int j = head[i];
     81     for(int j = head[i]; j ; j = Next[j])
     82     {
     83         int y = ver[j];
     84         
     85         if(y>N && !vvis[y-N] && !val[j])
     86         {
     87             vvis[y-N] = 1;
     88             go(y-N,rnt);
     89             return ;
     90         }
     91     }
     92 }
     93 int main()
     94 {
     95     pillars = read();
     96     tot = 1;
     97     s = 0;
     98     t = 2*N+1;
     99     int ans = 0,balls = 0;
    100 
    101     while("Hatsune Miku")
    102     {
    103         ans ++;
    104         balls ++;
    105         _for(i,1,balls)
    106         if(sqrt(i+balls) == (int)sqrt(i+balls))
    107         {
    108             add(i,balls+N,1);
    109             add(balls+N,i,0);
    110         }
    111         add(0,balls,1);
    112         add(balls,0,0);
    113         add(balls+N,2*N+1,1);
    114         add(2*N+1,balls+N,0);
    115         int flow = 0;
    116         while(bfs())
    117             while(flow = dinic(s,INF))
    118                 ans -= flow;
    119         if(ans > pillars)
    120             break;
    121     }
    122     
    123     printf("%d
    ",balls-1);
    124     vvis[0] = 1;vvis[balls] = 1;
    125     _for(i,1,balls)
    126         for(int j = head[i+N]; j ; j = Next[j])
    127             if(ver[j]==2*N+1 && val[j]==1)
    128                 st.pb(i),vvis[i] = 1;
    129 
    130     vector<int> tmp;
    131     _for(i,0,st.size())
    132     {
    133         vvis[st[i]] = 1,go(st[i],tmp);
    134         _for(j,0,tmp.size()-1)
    135         printf("%d ",tmp[j]);
    136         printf("%d
    ",tmp[tmp.size()-1]);
    137         tmp.clear();
    138     }
    139 
    140     return 0;
    141 }
  • 相关阅读:
    cookie、 Session Storage 、 Local Storage
    json 常用的方法
    ssm 框架 使用ajax异步,实现登陆
    ssm框架整合,配置文件中的配置内容
    ipv4和ipv6的区别
    分析域名的解析过程
    网络体系结构总结
    线程同步和异步
    博客目录
    [STM32H743]按键控制LED
  • 原文地址:https://www.cnblogs.com/Asurudo/p/11638649.html
Copyright © 2011-2022 走看看