Cod sursa(job #986457)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 18 august 2013 20:37:10
Problema Taramul Nicaieri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<fstream>
#include<cstring>
using namespace std;
typedef struct celula{
           int nod;
           celula *next;
           }*lista;
lista graf[205],v,q,aux;
int cost[205][205],i,j,n,m,x,y,tata[205],coada[205],s,d,sol;
bool ok,viz[205];

/*void update(){
     int flow=1000,aux=d;
      while (tata[aux]!=aux) { flow=min(flow,cost[tata[aux]][aux]); aux=tata[aux]; }
       aux=d; sol+=flow;
      while (tata[aux]!=aux) { cost[tata[aux]][aux]-=flow; cost[aux][tata[aux]]+=flow; aux=tata[aux]; }
}

void bfs(){
     int begin,end,i;
       begin=end=1; coada[1]=0; memset(viz,0,sizeof(viz)); memset(tata,0,sizeof(tata)); viz[0]=1;
      while (begin<=end) {
            int nod=coada[begin];
            for (lista p=graf[nod]; p; p=p->next)
             if (viz[p->nod]==0&&cost[nod][p->nod]>0) {
                         tata[p->nod]=nod;
                         if (p->nod==d) { ok=1; update(); }
                             else { ++end; coada[end]=p->nod; viz[p->nod]=1; }
                  }
            viz[nod]=0; ++begin;
      }
}
*/

inline void update(){
     int nod=d,min=1000000;
     while (tata[nod]!=-1){
           if (cost[tata[nod]][nod]<min) min=cost[tata[nod]][nod];
           nod=tata[nod];
           }
     nod=d; sol+=min;
     while (tata[nod]!=-1){
           cost[tata[nod]][nod]-=min;
           cost[nod][tata[nod]]+=min;
           nod=tata[nod];
           }
}
 
inline void bfs(){
     v=new celula; v->nod=0; v->next=0; q=v; tata[0]=-1; ok=0;
      memset(viz,0,sizeof(viz)); viz[0]=1;
     while (v!=0) {
           for (lista p=graf[v->nod];p; p=p->next){
               if (viz[p->nod]==0&&cost[v->nod][p->nod]>0) { if (p->nod!=d) {aux=new celula; aux->nod=p->nod; q->next=aux; q=aux; q->next=0;} tata[p->nod]=v->nod; viz[p->nod]=1;}
                if (viz[d]==1){ok=1; update(); viz[d]=0; }
                }
           v=v->next;
     }
}

void muchie(int x, int y) { v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v; }

int main(void){
    ifstream fin("harta.in");
    ofstream fout("harta.out");
    fin>>n; d=2*n+1; s=0;
    for (i=1; i<=n; ++i) {
        fin>>x>>y; m+=x; cost[s][i]=x; cost[n+i][d]=y; muchie(s,i); muchie(n+i,d);
         for (j=1; j<=n; ++j)
          if (j!=i){ cost[i][n+j]=1; muchie(i,n+j); }
        }
    fout<<m<<"\n"; ok=1;
     while (ok) bfs();
      //fout<<sol<<"\n";
    for (i=1; i<=n; ++i) 
     for (j=1; j<=n; ++j)
      if (cost[i][n+j]==0&&i!=j) fout<<i<<" "<<j<<"\n";
 return(0);
}