Cod sursa(job #404797)

Utilizator bora_marianBora marian bora_marian Data 26 februarie 2010 18:40:48
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<fstream>
#include<algorithm>
using namespace std;
struct matrice{
       int ind;
       int val;};
matrice x[1003][10003];
int t[1024],critice[1024],n,m,nrsol,xu[1024],yu[1024],nrc;
struct nod{
       int info;
       nod *next;};
nod *g[1003];
void ek();
void adauga(int a,int b);
ofstream fout("critice.out");
void verif ();
int bfs(int sursa,int des);
int main()
{
    ifstream fin("critice.in");
    fin>>n>>m;
    int i;
    for(i=1;i<=m;i++)
     {
       int a,b,c;
       fin>>a>>b>>c;
       x[a][b].val=c;
       x[b][a].val=c;
       x[a][b].ind=i;
       x[b][a].ind=i;
       adauga(a,b);
       adauga(b,a);
     } 
   ek();
   for(i=1;i<=nrsol;i++)
    if(xu[i]==1 || bfs(xu[i],1) && (yu[i]==n)|| bfs(yu[i],n))
          critice[++nrc]=x[xu[i]][yu[i]].ind; 
   fout<<nrc<<endl;  
   sort(critice+1,critice+nrc+1);
   for(i=1;i<=nrc;i++)
    fout<<critice[i]<<endl;
  return 0;
}
int bfs(int sursa,int des)
{
 int  coada[1024],st,dr,i;
  st=dr=1;
  for(i=1;i<=n;i++)
    t[i]=-1;
  coada[st]=sursa;
  t[sursa]=0;
  while(st<=dr)
  {
   int k=coada[st++];
   for(nod *p=g[k];p;p=p->next)
     if(t[p->info]==-1 && x[k][p->info].val>0)
     {
            t[p->info]=k;
            if(p->info==des)
              return 1;
            coada[++dr]=p->info;
      }
   }
 return 0;
}                                                        
void ek()
{
  int i,cmin=1000000000;
  while(bfs(1,n))
  {
    cmin=1000000000;
    for(i=n;t[i];i=t[i])
       if(x[t[i]][i].val<cmin)
         cmin=x[t[i]][i].val;
    for(i=n;t[i];i=t[i])
    {
      x[t[i]][i].val-=cmin;
      x[i][t[i]].val-=cmin;
      if(x[i][t[i]].val==0)
        xu[++nrsol]=t[i],yu[nrsol]=i;
      }
    }
}
void adauga(int a,int b)
{ 
   nod *p;
   p=new nod;
   p->info=b;
   p->next=g[a];
   g[a]=p;
}