zoukankan      html  css  js  c++  java
  • No Smoking, Please Gym

    No Smoking, Please

     Gym - 101518H 

    最小割~

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 const int maxv = 1000110;
      4 const int maxe = 4000010;
      5 const int inf = 0x3f3f3f3f;
      6 struct Edge{
      7     int u, v, nex;
      8     int cap, flow;
      9     Edge(int u=0, int v=0, int nex=0, int cap=0, int flow=0):
     10         u(u), v(v), nex(nex), cap(cap), flow(flow){}
     11 }e[maxe<<1];
     12 int head[maxv];
     13 int cnt;
     14 void init(){
     15     memset(head, -1, sizeof(head));
     16     cnt = 0;
     17 }
     18 
     19 void add(int u, int v, int cap){
     20     e[cnt] = Edge(u, v, head[u], cap, 0);
     21     head[u] = cnt++;
     22     e[cnt] = Edge(v, u, head[v], cap, 0);
     23     head[v] = cnt++;
     24 }
     25 
     26 int d[maxv], num[maxv], cur[maxv], p[maxv];
     27 int vis[maxv];
     28 int S, T;
     29 int N;
     30 
     31 void bfs(){
     32     memset(d, -1, sizeof(d));
     33     memset(vis, 0, sizeof(vis));
     34     queue<int> q;
     35     q.push(T);
     36     vis[T] = 1;
     37     d[T] = 0;
     38     while(!q.empty()){
     39         int u = q.front();
     40         q.pop();
     41         for(int i = head[u]; ~i; i = e[i].nex){
     42            // int id = i&(-2);  //正边   //这里错了!!!
     43            int id = i; 
     44            int v = e[id].v;
     45             if(!vis[v] && e[id].cap > e[id].flow){
     46                 vis[v] = 1;
     47                 d[v] = d[u] + 1;
     48                 q.push(v);
     49             }
     50         }
     51     }
     52 }
     53 
     54 int augment(){
     55     int u = T;
     56     int a = inf;
     57     while(u!=S){
     58         int id = p[u];
     59         a = min(a, e[id].cap - e[id].flow);
     60         u = e[id].u;
     61     }
     62     u = T;
     63     while(u!=S){
     64         int id = p[u];
     65         e[id].flow += a;
     66         e[id^1].flow -= a;
     67         u = e[id].u;
     68     }
     69     return a;
     70 }
     71 
     72 int ISAP() {
     73     bfs();
     74     int flow = 0;
     75     memset(num, 0, sizeof(num));
     76     for(int i = 0; i < N; i++) {
     77         cur[i] = head[i];
     78         if(~d[i]) num[d[i]]++;
     79     }
     80     int u = S;
     81     while(d[S] < N) {
     82         if(u == T) {
     83             flow += augment();
     84             u = S;
     85         }
     86         int ok = 0;
     87         for(int i = cur[u]; ~i; i = e[i].nex){
     88             int v = e[i].v;
     89             if(d[u] == d[v]+1 && e[i].cap > e[i].flow){
     90                 p[v] = i;
     91                 ok = 1;
     92                 cur[u] = i;
     93                 u = v;
     94                 break;
     95             }
     96         }
     97         if(!ok){
     98             int m = N-1;
     99             for(int i = head[u]; ~i; i = e[i].nex){
    100                 if(e[i].cap > e[i].flow && ~d[e[i].v]) m = min(m, d[e[i].v]);
    101             }
    102             if(--num[d[u]] == 0) break;
    103             num[d[u]=m+1]++;
    104             cur[u] = head[u];
    105             if(u != S) u = e[p[u]].u;
    106         }
    107     }
    108     return flow;
    109 }
    110 void pre(){
    111     freopen("in.txt", "w", stdout);
    112     int t = 1000;
    113     cout<<t<<endl;
    114     while(t--){
    115         srand(rand());
    116         int n = rand()%50+2;
    117         int m = rand()%50+2;
    118         cout<<n<<" "<<m<<endl;
    119         int sx = rand()%50+2, sy = rand()%50+2;
    120         int ex = rand()%50+2, ey = rand()%50+2;
    121         while(sx == ex && sy == ey) {
    122             ex = rand()%50+2;
    123             ey = rand()%50+2;
    124         }
    125         printf("%d %d %d %d
    ", sx, sy, ex, ey);
    126         for(int i = 0; i < n; i++){
    127             for(int j = 0; j < m-1; j++){
    128                 cout<<rand()%110<<" ";
    129             }
    130             cout<<endl;
    131         }
    132         for(int i = 0; i < n-1; i++){
    133             for(int j = 0; j < m; j++){
    134                 cout<<rand()%110<<" ";
    135             }
    136             cout<<endl;
    137         }
    138     }
    139 }
    140 int main(){
    141     int t;
    142   //  pre();
    143    // freopen("in.txt", "r", stdin);
    144    // freopen("out.txt", "w", stdout);
    145     scanf("%d", &t);
    146     while(t--){
    147         init();
    148         int n, m;
    149         scanf("%d %d", &n, &m);
    150         int a, b;
    151         scanf("%d %d", &a, &b);
    152         S = a*m + b;
    153         scanf("%d %d", &a, &b);
    154         T = a*m + b;
    155         N = n*m;
    156         for(int i = 0; i < n; i++){
    157             for(int j = 0; j < m-1; j++){
    158                 scanf("%d", &a);
    159                 if(!a) continue;
    160                 int id = i*m+j;
    161                 add(id, id+1, a+1);
    162             }
    163         }
    164         for(int i = 0; i < n-1; i++){
    165             for(int j = 0; j < m; j++){
    166                 scanf("%d", &a);
    167                 if(!a) continue;
    168                 int id = i*m+j;
    169                 add(id, id+m, a+1);
    170             }
    171         }
    172         int ans = ISAP();
    173         printf("%d
    ", ans*1000);
    174     }
    175     return 0;
    176 }
    ISAP
      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 #define CLR(m,a) memset(m,a,sizeof(m))
      4 const int inf=0x3f3f3f3f;
      5 const int maxv=1000010;
      6 const int maxe=4000010;
      7 int N;
      8 struct Edge
      9 {
     10     int u,v,cap,flow;
     11     int nex;
     12 }e[maxe<<1];
     13 int head[maxv];
     14 int cnt=0;
     15 void init()
     16 {
     17     CLR(head,-1);
     18     cnt=0;
     19 }
     20 void add(int u,int v,int cap)
     21 {
     22     e[cnt].u=u;
     23     e[cnt].v=v;
     24     e[cnt].cap=cap;
     25     e[cnt].flow=0;
     26     e[cnt].nex=head[u];
     27     head[u]=cnt++;
     28 }
     29 
     30 int vis[maxv],d[maxv],cur[maxv];
     31 int s,t;  //这里设成了全局变量,用此模板前需要初始化源和汇
     32 
     33 int bfs()
     34 {
     35     CLR(vis,0);
     36     queue<int> q;
     37     q.push(s);
     38     d[s]=0;
     39     vis[s]=1;
     40     while(!q.empty())
     41     {
     42         int u=q.front();
     43         q.pop();
     44         for(int i=head[u];~i;i=e[i].nex)
     45         {
     46             int v=e[i].v;
     47             if(!vis[v]&&e[i].cap>e[i].flow)
     48             {
     49                 vis[v]=1;
     50                 d[v]=d[u]+1;
     51                 q.push(v);
     52             }
     53         }
     54     }
     55     return vis[t];
     56 }
     57 
     58 int dfs(int x,int a)
     59 {
     60     if(x==t||a==0) return a;
     61     int flow=0,f;
     62     for(int &i=cur[x];~i;i=e[i].nex)
     63     {
     64         int v=e[i].v;
     65         if(d[x]+1==d[v]&&(f=dfs(v,min(a,e[i].cap-e[i].flow)))>0)
     66         {
     67             e[i].flow+=f;
     68             e[i^1].flow-=f;
     69             flow+=f;
     70             a-=f;
     71             if(a==0) break;
     72         }
     73     }
     74     return flow;
     75 }
     76 
     77 int Dinic()
     78 {
     79     int flow=0;
     80     while(bfs())
     81     {
     82         for(int i=0;i<N;i++) cur[i]=head[i];
     83         flow+=dfs(s,inf);
     84     }
     85     return flow;
     86 }
     87 int main(){
     88     int T;
     89    // freopen("in.txt", "r", stdin);
     90     scanf("%d", &T);
     91     while(T--){
     92         init();
     93         int n, m;
     94         scanf("%d %d", &n, &m);
     95         int a, b;
     96         scanf("%d %d", &a, &b);
     97         s = a*m + b;
     98         scanf("%d %d", &a, &b);
     99         t = a*m + b;
    100         N = n*m;
    101         for(int i = 0; i < n; i++){
    102             for(int j = 0; j < m-1; j++){
    103                 scanf("%d", &a);
    104                 if(!a) continue;
    105                 int id = i*m+j;
    106                 add(id, id+1, a+1);
    107                 add(id+1, id, a+1);
    108             }
    109         }
    110         for(int i = 0; i < n-1; i++){
    111             for(int j = 0; j < m; j++){
    112                 scanf("%d", &a);
    113                 if(!a) continue;
    114                 int id = i*m+j;
    115                 add(id, id+m, a+1);
    116                 add(id+m, id, a+1);
    117             }
    118         }
    119         int ans = Dinic();
    120         printf("%d
    ", ans*1000);
    121     }
    122     return 0;
    123 }
    DINIC

    终于过了

      1 /*
      2 #include <bits/stdc++.h>
      3 using namespace std;
      4 const int maxv = 1000110;
      5 const int maxe = 4000010;
      6 const int inf = 0x3f3f3f3f;
      7 struct Edge{
      8     int u, v, nex;
      9     int cap, flow;
     10     Edge(int u=0, int v=0, int nex=0, int cap=0, int flow=0):
     11         u(u), v(v), nex(nex), cap(cap), flow(flow){}
     12 }e[maxe<<1];
     13 int head[maxv];
     14 int cnt;
     15 void init(){
     16     memset(head, -1, sizeof(head));
     17     cnt = 0;
     18 }
     19 
     20 void add(int u, int v, int cap){
     21     e[cnt] = Edge(u, v, head[u], cap, 0);
     22     head[u] = cnt++;
     23     e[cnt] = Edge(v, u, head[v], cap, 0);
     24     head[v] = cnt++;
     25 }
     26 
     27 int d[maxv], num[maxv], cur[maxv], p[maxv];
     28 int vis[maxv];
     29 int S, T;
     30 int N;
     31 
     32 void bfs(){
     33     memset(d, -1, sizeof(d));
     34     memset(vis, 0, sizeof(vis));
     35     queue<int> q;
     36     q.push(T);
     37     vis[T] = 1;
     38     d[T] = 0;
     39     while(!q.empty()){
     40         int u = q.front();
     41         q.pop();
     42         for(int i = head[u]; ~i; i = e[i].nex){
     43            // int id = i&(-2);  //正边   //这里错了!!!
     44            int id = i; 
     45            int v = e[id].v;
     46             if(!vis[v] && e[id].cap > e[id].flow){
     47                 vis[v] = 1;
     48                 d[v] = d[u] + 1;
     49                 q.push(v);
     50             }
     51         }
     52     }
     53 }
     54 
     55 int augment(){
     56     int u = T;
     57     int a = inf;
     58     while(u!=S){
     59         int id = p[u];
     60         a = min(a, e[id].cap - e[id].flow);
     61         u = e[id].u;
     62     }
     63     u = T;
     64     while(u!=S){
     65         int id = p[u];
     66         e[id].flow += a;
     67         e[id^1].flow -= a;
     68         u = e[id].u;
     69     }
     70     return a;
     71 }
     72 
     73 int ISAP() {
     74     bfs();
     75     int flow = 0;
     76     memset(num, 0, sizeof(num));
     77     for(int i = 0; i < N; i++) {
     78         cur[i] = head[i];
     79         if(~d[i]) num[d[i]]++;
     80     }
     81     int u = S;
     82     while(d[S] < N) {
     83         if(u == T) {
     84             flow += augment();
     85             u = S;
     86         }
     87         int ok = 0;
     88         for(int i = cur[u]; ~i; i = e[i].nex){
     89             int v = e[i].v;
     90             if(d[u] == d[v]+1 && e[i].cap > e[i].flow){
     91                 p[v] = i;
     92                 ok = 1;
     93                 cur[u] = i;
     94                 u = v;
     95                 break;
     96             }
     97         }
     98         if(!ok){
     99             int m = N-1;
    100             for(int i = head[u]; ~i; i = e[i].nex){
    101                 if(e[i].cap > e[i].flow && ~d[e[i].v]) m = min(m, d[e[i].v]);
    102             }
    103             if(--num[d[u]] == 0) break;
    104             num[d[u]=m+1]++;
    105             cur[u] = head[u];
    106             if(u != S) u = e[p[u]].u;
    107         }
    108     }
    109     return flow;
    110 }
    111 void pre(){
    112     freopen("in.txt", "w", stdout);
    113     int t = 1000;
    114     cout<<t<<endl;
    115     while(t--){
    116         srand(rand());
    117         int n = rand()%50+1;
    118         int m = rand()%50+1;
    119         cout<<n<<" "<<m<<endl;
    120         int sx = rand()%50+1, sy = rand()%50+1;
    121         int ex = rand()%50+1, ey = rand()%50+1;
    122         while(sx == ex && sy == ey) {
    123             ex = rand()%50+1;
    124             ey = rand()%50+1;
    125         }
    126         printf("%d %d %d %d
    ", sx, sy, ex, ey);
    127         for(int i = 0; i < n; i++){
    128             for(int j = 0; j < m-1; j++){
    129                 cout<<rand()%110<<" ";
    130             }
    131             cout<<endl;
    132         }
    133         for(int i = 0; i < n-1; i++){
    134             for(int j = 0; j < m; j++){
    135                 cout<<rand()%110<<" ";
    136             }
    137             cout<<endl;
    138         }
    139     }
    140 }
    141 int main(){
    142     int t;
    143     pre();
    144     freopen("in.txt", "r", stdin);
    145     freopen("out.txt", "w", stdout);
    146     scanf("%d", &t);
    147     while(t--){
    148         init();
    149         int n, m;
    150         scanf("%d %d", &n, &m);
    151         int a, b;
    152         scanf("%d %d", &a, &b);
    153         S = a*m + b;
    154         scanf("%d %d", &a, &b);
    155         T = a*m + b;
    156         N = n*m;
    157         for(int i = 0; i < n; i++){
    158             for(int j = 0; j < m-1; j++){
    159                 scanf("%d", &a);
    160                 if(!a) continue;
    161                 int id = i*m+j;
    162                 add(id, id+1, a+1);
    163             }
    164         }
    165         for(int i = 0; i < n-1; i++){
    166             for(int j = 0; j < m; j++){
    167                 scanf("%d", &a);
    168                 if(!a) continue;
    169                 int id = i*m+j;
    170                 add(id, id+m, a+1);
    171             }
    172         }
    173         int ans = ISAP();
    174        if(ans) printf("%d
    ", ans*1000);
    175     }
    176     return 0;
    177 }
    178 */
    179 #include <bits/stdc++.h>
    180 using namespace std;
    181 #define CLR(m,a) memset(m,a,sizeof(m))
    182 const int inf=0x3f3f3f3f;
    183 const int maxv=1000010;
    184 const int maxe=4000010;
    185 int N;
    186 struct Edge
    187 {
    188     int u,v,cap,flow;
    189     int nex;
    190 }e[maxe<<1];
    191 int head[maxv];
    192 int cnt=0;
    193 void init()
    194 {
    195     CLR(head,-1);
    196     cnt=0;
    197 }
    198 void add(int u,int v,int cap)
    199 {
    200     e[cnt].u=u;
    201     e[cnt].v=v;
    202     e[cnt].cap=cap;
    203     e[cnt].flow=0;
    204     e[cnt].nex=head[u];
    205     head[u]=cnt++;
    206 }
    207 
    208 int vis[maxv],d[maxv],cur[maxv];
    209 int s,t;  //这里设成了全局变量,用此模板前需要初始化源和汇
    210 
    211 int bfs()
    212 {
    213     CLR(vis,0);
    214     queue<int> q;
    215     q.push(s);
    216     d[s]=0;
    217     vis[s]=1;
    218     while(!q.empty())
    219     {
    220         int u=q.front();
    221         q.pop();
    222         for(int i=head[u];~i;i=e[i].nex)
    223         {
    224             int v=e[i].v;
    225             if(!vis[v]&&e[i].cap>e[i].flow)
    226             {
    227                 vis[v]=1;
    228                 d[v]=d[u]+1;
    229                 q.push(v);
    230             }
    231         }
    232     }
    233     return vis[t];
    234 }
    235 
    236 int dfs(int x,int a)
    237 {
    238     if(x==t||a==0) return a;
    239     int flow=0,f;
    240     for(int &i=cur[x];~i;i=e[i].nex)
    241     {
    242         int v=e[i].v;
    243         if(d[x]+1==d[v]&&(f=dfs(v,min(a,e[i].cap-e[i].flow)))>0)
    244         {
    245             e[i].flow+=f;
    246             e[i^1].flow-=f;
    247             flow+=f;
    248             a-=f;
    249             if(a==0) break;
    250         }
    251     }
    252     return flow;
    253 }
    254 
    255 int Dinic()
    256 {
    257     int flow=0;
    258     while(bfs())
    259     {
    260         for(int i=0;i<N;i++) cur[i]=head[i];
    261         flow+=dfs(s,inf);
    262     }
    263     return flow;
    264 }
    265 int main(){
    266     int T;
    267     freopen("in.txt", "r", stdin);
    268     freopen("out1.txt", "w", stdout);
    269     scanf("%d", &T);
    270     while(T--){
    271         init();
    272         int n, m;
    273         scanf("%d %d", &n, &m);
    274         int a, b;
    275         scanf("%d %d", &a, &b);
    276         s = a*m + b;
    277         scanf("%d %d", &a, &b);
    278         t = a*m + b;
    279         N = n*m;
    280         for(int i = 0; i < n; i++){
    281             for(int j = 0; j < m-1; j++){
    282                 scanf("%d", &a);
    283                 if(!a) continue;
    284                 int id = i*m+j;
    285                 add(id, id+1, a+1);
    286                 add(id+1, id, a+1);
    287             }
    288         }
    289         for(int i = 0; i < n-1; i++){
    290             for(int j = 0; j < m; j++){
    291                 scanf("%d", &a);
    292                 if(!a) continue;
    293                 int id = i*m+j;
    294                 add(id, id+m, a+1);
    295                 add(id+m, id, a+1);
    296             }
    297         }
    298         int ans = Dinic();
    299         if(ans)printf("%d
    ", ans*1000);
    300     }
    301     return 0;
    302 }
    View Code
  • 相关阅读:
    jQuery的核心对象、原型对象、静态方法、动态方法
    请写出css中选择器(元素选择器、类选择器、id选择器)的优先级顺序,和当各种选择器组合时,优先级的计算规则是什么?
    css3中的box-sizing常用的属性有哪些?分别有什么作用?
    不同域的页面如何通信(跨域)
    浮动与定位
    获取DOM元素的方式有哪些
    简要说明盒子模型和flex布局
    牛逼哄哄的对象深复制
    欧拉函数
    P2659 美丽的序列
  • 原文地址:https://www.cnblogs.com/yijiull/p/7636538.html
Copyright © 2011-2022 走看看