Hướng dẫn giải của Hệ thống đèn


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

#include<iostream>
#include<algorithm>
#define fr(a,b,c) for (a=b;a<=c;a++)
#define oo 1000000000
using namespace std;
int m,n,s,t,c[222][222],f[222][222],q[222],d[222],p[222];

void push(int &nq,int x,int y,int vl,int val)
{
     nq++; q[nq]=y; d[y]=x; p[y]=min(vl,val);
}

int find()
{
    int nq=1,i=1,x,y;
    fr(x,1,n) d[x]=0; 
    q[1]=s; d[s]=s; p[s]=oo;
    while (i<=nq)
    {
          x=q[i++];
          fr(y,1,n)
            if (!d[y])
            {
               if (f[x][y]<c[x][y]) push(nq,x,y,p[x],c[x][y]-f[x][y]);
               else
                   if (f[y][x]) push(nq,-x,y,p[x],f[y][x]);
               if (d[t]) return 1;
            }
    }
    return 0;
}

void incflow()
{
     int x=t,y,val=p[t];
     while (x!=s)
     {
           y=x; x=d[x];
           if (x>0) f[x][y]+=val;
           else
           {
               x=-x;
               f[y][x]-=val;
           }
     }
}

int main()
{
    int k,i,x,y,re=0;
    cin >> m >> n >> k;
    s=n+m+1; t=s+1;
    fr(i,1,m)
    {
       cin >> x; c[s][i]=x;
    }
    fr(i,1,n)
    {
       cin >> x; c[m+i][t]=x;
    }
    while (k--)
    {
       scanf("%d%d",&x,&y);
       c[x][y+m]=oo;
    }
    n+=m+2;
    while (find()) incflow();
    fr(i,1,m) re+=f[s][i];
    cout << re << endl;       
    return 0;
}

Code mẫu của happyboy99x

#include<bits/stdc++.h>
using namespace std;

#define TR(v,i) for(__typeof((v).begin())i=(v).begin();i!=(v).end();++i)
const int INF = 1e9;
vector<vector<pair<int, int> > > g;
vector<int> flow, c;
vector<pair<int, int> > trace;
int m, n, p;

template<class T> int size(const T &a) { return a.size(); }

void addEdge(int u, int v, int lim) {
    g[u].push_back(make_pair(v, size(c)));
    g[v].push_back(make_pair(u, size(c)+1));
    c.push_back(lim); c.push_back(0);
    flow.push_back(0); flow.push_back(0);
}

void enter() {
    cin >> m >> n >> p;
    g.resize(m+n+2); trace.resize(m+n+2);
    for(int i = 0; i < m; ++i) {
        int c; cin >> c;
        addEdge(0, i+1, c);
    }
    for(int i = 0; i < n; ++i) {
        int c; cin >> c;
        addEdge(m+i+1, m+n+1, c);
    }
    for(int i = 0; i < p; ++i) {
        int x, y; cin >> x >> y; --x; --y;
        addEdge(x+1, m+y+1, INF);
    }
}

int maxflow(int s, int t) {
    int res = 0;
    while(true) {
        fill(trace.begin(), trace.end(), make_pair(INF, INF));
        trace[s] = make_pair(-1, -1);
        queue<int> q; q.push(s);
        while(!q.empty()) {
            int u = q.front(); q.pop();
            if(u == t) break;
            TR(g[u], it) {
                int v = it->first, e = it->second;
                if(trace[v].first == INF && c[e] - flow[e] > 0)
                    trace[v] = make_pair(u, e), q.push(v);
            }
        }
        if(trace[t].first == INF) break;
        int delta = INF;
        for(int v = t, u = trace[v].first; u != -1; v = u, u = trace[u].first)
            delta = min(delta, c[trace[v].second] - flow[trace[v].second]);
        for(int v = t, u = trace[v].first; u != -1; v = u, u = trace[u].first) {
            int e = trace[v].second;
            flow[e] += delta;
            flow[e ^ 1] -= delta;
        }
        res += delta;
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    enter();
    cout << maxflow(0, m+n+1) << '\n';
    return 0;
}

Code mẫu của ladpro98

#include <bits/stdc++.h>
const int N = 300;
const int oo = trunc(1e9);
using namespace std;
int c[N][N], f[N][N];
int Q[N], T[N], cx[N], cy[N];
int m, n, k, s = 0, t;
vector<int> a[N];

bool FindPath() {
    int l = 1, r = 1, i, u, v;
    Q[1] = s;
    for(i=1; i<=t; i++) T[i] = -1;
    while (l <= r) {
        u = Q[l++];
        for(i=0; i<a[u].size(); i++) {
            v = a[u][i];
            if (T[v] < 0 && c[u][v] > f[u][v]) {
                Q[++r] = v;
                T[v] = u;
                if (v == t) return true;
            }
        }
    }
    return false;
}

void IncFlow() {
    int v = t, delta = oo, u;
    while (v != s) {
        u = T[v];
        delta = min(delta, c[u][v] - f[u][v]);
        v = u;
    }
    v = t;
    while (v != s) {
        u = T[v];
        f[u][v] += delta;
        f[v][u] -= delta;
        v = u;
    }
}

int main()
{
    scanf("%d %d %d\n", &m, &n, &k);
    int i; t = m + n + 1;
    for(i=1; i<=m; i++)
        scanf("%d", &cx[i]);
    for(i=1; i<=n; i++)
        scanf("%d", &cy[i]);

    int x, y;
    for(i=1; i<=k; i++) {
        scanf("%d %d", &x, &y);
        c[x][m + y] = oo;
        a[x].push_back(m + y);
        a[m + y].push_back(x);
        if (c[s][x] == 0) {
            c[s][x] = cx[x];
            a[s].push_back(x);
        }
        if (c[m + y][t] == 0) {
            c[m + y][t] = cy[y];
            a[m + y].push_back(t);
        }
    }
    while (FindPath())
        IncFlow();
    int res = 0;
    for(i=1; i<=m; i++) res += f[s][i];
    printf("%d", res);
    return 0;
}

Code mẫu của RR

{$R+,Q+}
PROGRAM NKLIGHT;
CONST
  fi='';
  fo='';
  maxn=100;
  oo=101;
VAR
  m,n:longint;
  d,c:array[0..2*maxn+1,0..2*maxn+1] of integer;
  trace,dt,xet:array[0..2*maxn+1] of integer;
  s,t:longint;
  queue:array[1..2*maxn+2] of longint;
  first,last:longint;
Procedure ReadInput;
Var
  f:text;
  i,k:longint;
  u,v:longint;
Begin
  Assign(f,fi); Reset(f);
  Readln(f,m,n,k);
  s:=0; t:=m+n+1;
  For i:=1 to m do
    Read(f,c[s,i]);
  For i:=1 to n do
    Read(f,c[m+i,t]);
  For i:=1 to k do
  begin
    Readln(f,u,v);
    c[u,m+v]:=oo;
  end;
  Close(f);
End;
Procedure Init;
Var
  i:integer;
Begin
  Fillchar(xet,sizeof(xet),0);
  Fillchar(dt,sizeof(dt),0);
  For i:=1 to m+n+1 do trace[i]:=-1;
  trace[0]:=0;
  first:=1; last:=1;
  queue[1]:=s;
  xet[s]:=1;
  dt[s]:=oo;
End;
Function min(a,b:longint):longint;
Begin
  If a<b then min:=a else min:=b;
End;
Procedure FindPath;
Var
  i,u:longint;
Begin
  While first<=last do
  begin
    u:=queue[first]; inc(first);
    For i:=1 to m+n+1 do
    If (c[u,i]>0) and (d[u,i]<c[u,i]) and (xet[i]=0) then
      begin
        xet[i]:=1;
        dt[i]:=min(dt[u],c[u,i]-d[u,i]);
        trace[i]:=u;
        inc(last); queue[last]:=i;
      end
    else If (d[i,u]>0) and (xet[i]=0) and (c[i,u]>0) then
      begin
        xet[i]:=1;
        dt[i]:=min(dt[u],d[i,u]);
        trace[i]:=-u;
        inc(last); queue[last]:=i;
      end;
  end;
End;
Procedure IncFlow;
Var
  x,pre:longint;
Begin
  x:=t;
  repeat
    pre:=trace[x];
    If pre>=0 then d[pre,x]:=d[pre,x]+dt[t]
    else d[x,-pre]:=d[x,-pre]-dt[t];
    x:=abs(pre);
  until x=s;
End;
Procedure Solve;
Var
  i:integer;
Begin
  repeat
    Init;
    FindPath;
    If dt[t]>0 then IncFlow;
  until dt[t]=0;
End;
Procedure WriteOutput;
Var
  f:text;
  p,q,i,j:longint;
  cost:longint;
Begin
  Assign(f,fo); Rewrite(f);
  p:=0; q:=0;
  cost:=0;
  For i:=1 to m do
    If trace[i]=-1 then
      begin
        cost:=cost+c[0,i];
        inc(p);
      end;
  For i:=1 to n do
    If trace[m+i]<>-1 then
      begin
        cost:=cost+c[m+i,t];
        inc(q);
      end;
  Writeln(f,cost);
{  Writeln(f,p,' ',q);
  For i:=1 to m do
    If trace[i]=-1 then Writeln(f,i);
  For i:=1 to n do
    If trace[m+i]<>-1 then Writeln(f,i);}
  Close(f);
End;
BEGIN
  ReadInput;
  Solve;
  WriteOutput;
END.

Code mẫu của hieult

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
//#include <conio.h>
#define maxc 1111111111
#define maxn 311

using namespace std;

int n,m,k,s,t,c[maxn][maxn],f[maxn][maxn],qu[maxn],tr[maxn];

bool coduongtang(){
     int dau,cuoi,u,v;
     memset(tr,0,sizeof(tr));
     dau = 1; cuoi = 1;
     qu[dau] = s;
     tr[s] = n+m+3;
    // printf("co\n");
     do{
           u = qu[dau]; dau++;
           for(v = 1;v<=n+m+2;v++){
                if(tr[v]==0 && c[u][v]>f[u][v]){
                     tr[v] = u;
                     if(v==t)
                          return true;
                     cuoi++; qu[cuoi] = v;
                }
           }
     }while(dau<=cuoi);
     return false;
}

void duongtang(){
     int delta,u,v;
     delta = maxc;
     v = t;
     do{
         u = tr[v];
         if(c[u][v]-f[u][v]<delta) delta = c[u][v]-f[u][v];
         v = u;
     }while(v!=s);
     v = t;
     do{
         u = tr[v];
         f[u][v] = f[u][v]+delta;
         f[v][u] = f[v][u]-delta;
         v = u;
     }while(v!=s);
}

int main(){
     //freopen("LIGHT.in","r",stdin);
     int i,u,v;
     scanf("%d %d %d",&m,&n,&k);
     memset(c,0,sizeof(c));
     for(int i = 1;i<=m;i++) scanf("%d",&c[1][i+1]);
     for(int i = 1;i<=n;i++) scanf("%d",&c[m+i+1][n+m+2]);
     for(int i = 1;i<=k;i++){
          scanf("%d %d",&u,&v);
          c[u+1][m+v+1] = maxc;
     }
     s = 1;
     t = n+m+2;
     memset(f,0,sizeof(f));
     do{
          if(coduongtang()) duongtang();
          else break;
     }while(true);
     int w = 0;
     for(u = 1;u<=n+m+2;u++){
          if(f[s][u]>0)
              w+=f[s][u];
     }
     printf("%d",w);
     //getch();
}

Code mẫu của ll931110

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#define INF 1000000000
typedef long long ll;
using namespace std;

int f[210][210],c[210][210];
int trace[210];
int n,m,k;
int cnt = 0;
int start,end;
vector<int> adj[210];

bool findPath()
{
//     cout << "begin findpath" << endl;
     memset(trace,0,sizeof(trace));
     queue<int> q;  q.push(start);  trace[start] = -1;
     while (!q.empty())
     {
           int u = q.front();  q.pop();
           for (int i = 0; i < adj[u].size(); i++)
           {
               int v = adj[u][i];
               if (!trace[v] && c[u][v] > f[u][v])
               {
                  trace[v] = u;
                  if (v == end) return true;
                  q.push(v);
               };
           };
     };
     return false;
};

void IncFlow()
{
     int delta = INF,v = end;
     while (v != start)
     {
           int u = trace[v];
           delta = min(delta,c[u][v] - f[u][v]);
           v = u;
     };
     v = end;
     while (v != start)
     {
           int u = trace[v];
           f[u][v] += delta;  f[v][u] -= delta;
           v = u;
     };
};

void add_edge(int u,int v,int cost)
{
     adj[u].push_back(v);
     adj[v].push_back(u);
     c[u][v] = cost;
};

void maxFlow()
{
     while (1)
     {
           if (!findPath()) break;
           IncFlow();           
     };
};

int main()
{
//    freopen("light.in","r",stdin);
//    freopen("light.ou","w",stdout);
    scanf("%d %d %d", &m, &n, &k);
    start = 1;  end = n + m + 2;
    memset(c,0,sizeof(c));
    for (int i = 1; i <= m; i++)
    {
        int x;  scanf("%d", &x);
        add_edge(start,1 + i,x);
    };
    for (int i = 1; i <= n; i++)
    {
        int x;  scanf("%d", &x);
        add_edge(m + i + 1,end,x);
    };
    for (int i = 0; i < k; i++)
    {
        int x,y;
        scanf("%d %d", &x, &y);
        add_edge(1 + x,m + 1 + y,INF);
    };

/*    for (int i = 1; i <= end; i++)
    {
        for (int j = 0; j < adj[i].size(); j++) cout << adj[i][j] << ' ';
        cout << endl;        
    };*/

    memset(f,0,sizeof(f));
    maxFlow();
    int ret = 0;
    for (int i = 0; i < adj[start].size(); i++)
    {
        int v = adj[start][i];
        ret += f[start][v];
    };
    printf("%d\n", ret);
};

Code mẫu của skyvn97

#include<bits/stdc++.h>
#define FOR(i,a,b) for (int i=(a);i<=(b);i=i+1)
#define REP(i,n) for (int i=0;i<(n);i=i+1)
#define FORE(i,v) for (__typeof((v).begin()) i=(v).begin();i!=(v).end();i++)
using namespace std;
const int INF=(int)1e9+7;
class DinicFlow {
    private:
    vector<int> dist,head,q,work;
    vector<int> capa,flow,next,point;
    int n,m;
    public:
    DinicFlow() {
        n=0;m=0;
    }
    DinicFlow(int n,int _m) {
        this->n=n;
        this->m=0;
        dist=vector<int>(n+7);
        head=vector<int>(n+7,-1);
        q=vector<int>(n+7);
        work=vector<int>(n+7);
        int m=2*_m;
        capa=vector<int>(m+7);
        flow=vector<int>(m+7,0);
        next=vector<int>(m+7);
        point=vector<int>(m+7);     
    }
    void addedge(int u,int v,int c1,int c2) {
        point[m]=v;capa[m]=c1;flow[m]=0;next[m]=head[u];head[u]=m;m++;
        point[m]=u;capa[m]=c2;flow[m]=0;next[m]=head[v];head[v]=m;m++;
    }
    bool bfs(int s,int t) {
        FORE(it,dist) *it=-1;
        int sz=1;
        q[0]=s;dist[s]=0;
        REP(x,sz) {
            int u=q[x];
            for (int i=head[u];i>=0;i=next[i])
                if (dist[point[i]]<0 && flow[i]<capa[i]) {
                    dist[point[i]]=dist[u]+1;
                    q[sz]=point[i];
                    sz++;
                }
        }
        return (dist[t]>=0);
    }
    int dfs(int s,int t,int f) {
        if (s==t) return (f);
        for (int &i=work[s];i>=0;i=next[i])
            if (dist[point[i]]==dist[s]+1 && flow[i]<capa[i]) {
                int d=dfs(point[i],t,min(f,capa[i]-flow[i])) ;
                if (d>0) {
                    flow[i]+=d;
                    flow[i^1]-=d;
                    return (d);
                }
            }
        return (0);
    }
    int maxflow(int s,int t) {
        int ret=0;
        while (bfs(s,t)) {
            FOR(i,1,n) work[i]=head[i];
            while (true) {
                int d=dfs(s,t,INF);
                if (d<=0) break;
                ret+=d;
            }
        }
        return (ret);
    }
};
int m,n,k;
DinicFlow g;
void init(void) {
    scanf("%d",&m);
    scanf("%d",&n);
    scanf("%d",&k);
    g=DinicFlow(m+n+2,m+n+k);
    FOR(i,1,m) {
        int t;
        scanf("%d",&t);
        g.addedge(m+n+1,i,t,0);     
    }
    FOR(i,1,n) {
        int t;
        scanf("%d",&t);
        g.addedge(m+i,m+n+2,t,0);           
    }
    REP(i,k) {
        int x,y;
        scanf("%d",&x);
        scanf("%d",&y);
        g.addedge(x,m+y,INF,0);
    }
    printf("%d",g.maxflow(m+n+1,m+n+2));
}
int main(void) {
    init();
    return 0;
}

Code mẫu của khuc_tuan

import java.io.*;
import java.util.*;

public class Main {

    int n,m,k,st,en,sl;
    int[] a,b,q,la,e;
    int[][] c, f;

    void nhap() throws Exception{
        BufferedReader kb=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(kb.readLine());
        m=Integer.parseInt(st.nextToken());
        n=Integer.parseInt(st.nextToken());
        k=Integer.parseInt(st.nextToken());
        en=m+n+2;
        a=new int[m+1];
        b=new int[n+1];
        c=new int[m+n+3][m+n+3];
        f=new int[m+n+3][m+n+3];
        q=new int[m+n+3];
        la=new int[m+n+3];
        e=new int[m+n+3];
        st=new StringTokenizer(kb.readLine());
        for(int i=1;i<=m;++i) a[i]=Integer.parseInt(st.nextToken());
        st=new StringTokenizer(kb.readLine());
        for(int i=1;i<=n;++i) b[i]=Integer.parseInt(st.nextToken());
        int u,v;
        for(int i=1;i<=k;++i){
            st=new StringTokenizer(kb.readLine());
            u=Integer.parseInt(st.nextToken());
            v=Integer.parseInt(st.nextToken());
            c[u][v+m]=100000000;
        }
        for(int i=1;i<=m;++i) c[en-1][i]=a[i];
        for(int i=1;i<=n;++i) c[i+m][en]=b[i];
    }

    void tangluong(int v){
        int u,dt=e[v];
        sl+=dt;
        while(v!=st){
            u=la[v];
            if(u<0){
                u=-u;
                f[v][u]-=dt;
                v=u;
            }
            else{
                f[u][v]+=dt;
                v=u;
            }
        }
    }

    boolean bfs(){
        int l,r,u,v;
        q[l=r=0]=st;
        Arrays.fill(la,0);
        Arrays.fill(e,0);
        e[st]=100000000;
        la[st]=st;
        while(l<=r){
            u=q[l++];
            for(v=1;v<=en;++v) if(e[v]==0){
                if(c[u][v]>f[u][v]){
                    e[v]=Math.min(e[u],c[u][v]-f[u][v]);
                    la[v]=u;
                    q[++r]=v;
                }
                else if(f[v][u]>0) {
                    e[v]=Math.min(e[u],f[v][u]);
                    la[v]=-u;
                    q[++r]=v;
                }
            }
            if(e[en]>0) {
                tangluong(en);
                return true;
            }
        }
        return false;
    }

    void xuly(){
        st=en-1;
        while( bfs() ) ;
        System.out.println(sl);
    }

    void run() throws Exception{
        nhap();
        xuly();
    }

    public static void main(String[] args) throws Exception {
        new Main().run();
    }
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.