Cod sursa(job #1246346)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 20 octombrie 2014 22:47:41
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
 int n,m,c[1005][1005],fol[1005][1005],ant[1005],use[1005],res,inf=2147000000,sol=0,tx[10005],ty[10005];
 int crit[10005],meet[1005],k,valsx,valsy,valdx,valdy;
 vector <int> v[1005];
 queue <int> q;

 void DFS(int x,int val)
 { int i;
   for(i=0;i<v[x].size();i++)
   if (!meet[v[x][i]] && fol[x][v[x][i]]<c[x][v[x][i]])
     {meet[v[x][i]]=val; DFS(v[x][i],val);}
 }

 void BFS(int x)
 { int i,j,nod,nod2;
  while(!q.empty()) q.pop();
    memset(use,0,sizeof(use));
    memset(ant,0,sizeof(ant));

    q.push(x); use[x]=1;

    while(!q.empty())
    { nod=q.front(); q.pop();
       for(i=0;i<v[nod].size();i++)
       if (!use[v[nod][i]] && c[nod][v[nod][i]]>fol[nod][v[nod][i]])
       { nod2=v[nod][i];
         q.push(nod2);
         use[nod2]=1;
         ant[nod2]=nod;
       }
    }
 }

int main()
{ int i,j,x,y,cap,n1,n2;
    f>>n>>m;

    for(i=1;i<=m;i++)
     { f>>x>>y>>cap;
        c[x][y]=cap;
        c[y][x]=cap;
      v[x].push_back(y);
      v[y].push_back(x);
       tx[i]=x; ty[i]=y;
     }

     for(BFS(1);use[n]>0;BFS(1))
     {
        for(i=0;i<v[n].size();i++)
         if (use[v[n][i]] && c[v[n][i]][n]>fol[v[n][i]][n])
         {
             x=v[n][i]; res=c[x][n]-fol[x][n];

             while(ant[x])
             { n1=ant[x]; n2=x;
                 res=min(res,c[n1][n2]-fol[n1][n2]);
               x=ant[x];
             }

             x=v[n][i]; fol[x][n]+=res;

             while(ant[x])
             { n1=ant[x]; n2=x;
                fol[n1][n2]+=res;
                fol[n2][n1]+=res;
               x=ant[x];
             }
            sol+=res;
         }
     }
      meet[1]=1; meet[n]=2;
      DFS(1,1); DFS(n,2);

      for(i=1;i<=m;i++)
       if (fol[tx[i]][ty[i]]==c[tx[i]][ty[i]] && meet[tx[i]]+meet[ty[i]]==3)
         {k++; crit[k]=i;}


     g<<k<<"\n";
     for(i=1;i<=k;i++)
       g<<crit[i]<<"\n";

    return 0;
}