Cod sursa(job #782071)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 25 august 2012 19:29:50
Problema Cuplaj maxim de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include<fstream>
#define inf 1000000000
using namespace std;
typedef struct celula{
        short nod;
        celula *next;
        }*lista;
typedef struct w{short x,y;}muchie;
muchie a[50001];
lista graf[601],v,f;
int e,sol,dist[601],dep[301],i;
short tata[601],cost[601][601],n,m,coada[100000],cap[601][601];
bool ok,viz[601];

inline void ford(){
       for (i=1; i<=n+m+1; ++i) { dist[i]=inf; viz[i]==0; }
        int st=0,sf=0; coada[st]=0; viz[0]=1;
       while (st<=sf) {
             for (lista p=graf[coada[st]];p; p=p->next)
              if ( cap[coada[st]][p->nod]==1&&dist[coada[st]]+cost[coada[st]][p->nod]<dist[p->nod] ){
                   dist[p->nod]=dist[coada[st]]+cost[coada[st]][p->nod];
                    tata[p->nod]=coada[st];
                   if (viz[p->nod]==0) { ++sf; coada[sf]=p->nod; viz[p->nod]=true; }
                  }
         viz[coada[st]]=0; ++st; 
        }
       if (dist[n+m+1]==inf) ok=false;
        else {
             short nod=n+m+1; sol+=dist[n+m+1];
              while (tata[nod]!=nod){
                       cap[tata[nod]][nod]-=1;
                        cap[nod][tata[nod]]+=1;
                         nod=tata[nod];
                           }
       }
}

int main(void){
    ifstream fin("cmcm.in");
    ofstream fout("cmcm.out");
    fin>>n>>m>>e; int x,y,c,nr=0;
    for (i=1; i<=e; ++i){
        fin>>x>>y>>c; y+=n; cost[x][y]=c; cost[y][x]=-c; cap[x][y]=1;
        v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
        v=new celula; v->nod=x; v->next=graf[y]; graf[y]=v;
        a[i].x=x; a[i].y=y;
        }
    // adaug sursa
    for (i=1; i<=n; ++i){
     cap[0][i]=1; 
       v=new celula; v->nod=0; v->next=graf[i]; graf[i]=v;
        v=new celula; v->nod=i; v->next=graf[0]; graf[0]=v;
        }
    //adaug destinatia
    for (i=1; i<=m; ++i){
      cap[i+n][n+m+1]=1; 
       v=new celula; v->nod=i+n; v->next=graf[n+m+1]; graf[n+m+1]=v;
        v=new celula; v->nod=n+m+1; v->next=graf[i+n]; graf[i+n]=v;
        }
    ok=true;
     while (ok==true)ford();
    for (i=1; i<=e; ++i)
     if (cap[a[i].x][a[i].y]==false){++nr; dep[nr]=i; }
    fout<<nr<<" "<<sol<<"\n";
    for (i=1; i<=nr; ++i) fout<<dep[i]<<" ";
 return(0);
}