Cod sursa(job #2469689)

Utilizator Raresr14Rosca Rares Raresr14 Data 7 octombrie 2019 21:03:06
Problema Taramul Nicaieri Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <vector>
#include <climits>
#include <bitset>
#define DIM 320
#define X first
#define Y second
using namespace std;
ifstream fin("harta.in");
ofstream fout("harta.out");
int n,i,maxi,dst,minim,x,y,c[DIM],rasp,p,u,k,flux[DIM][DIM],T[DIM],r[DIM][DIM],s;
pair<int,int> sol[5010];
vector<int> L[DIM];
bitset<DIM> f;
int bfs(){
    f.reset();
    p=u=f[0]=1;
    c[1]=0;
    while(p<=u){
        int nod=c[p];
        for(int i=0;i<L[nod].size();i++){
            int vec=L[nod][i];
            if(f[vec]==0&&(r[nod][vec]-flux[nod][vec]>0)){
                c[++u]=vec;
                f[vec]=1;
                T[vec]=nod;
            }
        }
        p++;
    }
    return f[n];
}

int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            if(i!=j){
                L[i].push_back(n+j);
                L[n+j].push_back(i);
                r[i][n+j]=1;
            }
    }
    dst=300;
    for(i=1;i<=n;i++){
        fin>>x>>y;
        L[0].push_back(i);
        L[i].push_back(0);
        L[n+i].push_back(dst);
        L[dst].push_back(n+i);
        r[0][i]=x;
        r[n+i][dst]=y;
    }
    while(bfs()){
        for(i=0;i<L[dst].size();i++){
            int nod=L[dst][i];
            if(r[nod][dst]>flux[nod][dst]&&f[nod]==1){
                minim=r[nod][dst]-flux[nod][dst];
                while(nod){
                    minim=min(minim,r[T[nod]][nod]-flux[T[nod]][nod]);
                    nod=T[nod];
                }
                rasp+=minim;
                nod=L[dst][i];
                flux[nod][dst]+=minim;
                flux[dst][nod]-=minim;
                while(nod){
                    flux[T[nod]][nod]+=minim;
                    flux[nod][T[nod]]-=minim;
                    nod=T[nod];
                }
            }
        }
    }
    for(i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(flux[i][n+j]==1){
                sol[++s].X=i;
                sol[s].Y=j;
            }
    fout<<s<<"\n";
    for(i=1;i<=s;i++)
        fout<<sol[i].X<<" "<<sol[i].Y<<"\n";
    return 0;
}