Cod sursa(job #1217802)

Utilizator azkabancont-vechi azkaban Data 8 august 2014 11:30:23
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define maxN 1013
using namespace std;
void openIOFiles()
{
 freopen("critice.in","r",stdin);
 freopen("critice.out","w",stdout);
}

vector <int> g[maxN];
int c[maxN][maxN];
int f[maxN][maxN];
int mem[maxN][maxN];
int T[maxN]; 
int sol[maxN];
int flux(0),S,D,i,n,x,y,m,aux,solutie(0),j;
 
inline int bfs()
{
 int ok=0;
 queue <int> q;
 vector <int>::iterator it;
 memset(T,0,sizeof(T));
 T[S]=-1;
 q.push(S);
 while(!q.empty()) 
     {
      int nod=q.front();
      for(it=g[nod].begin();it!=g[nod].end();++it)
        if(T[*it]==0&&c[nod][*it]>f[nod][*it])
                  {
                   if(*it!=D){
                              T[*it]=nod;
                              q.push(*it);
                             }
                         else ok=1;
                   }
    q.pop();
    }
 return ok;
}
 
inline void dinic()
{
 vector <int>::iterator it;
 int drum;
 for(;bfs();)
   for(it=g[D].begin();it!=g[D].end();++it)
        if(T[*it]&&c[*it][D]>f[*it][D]){
                                        T[D]=*it;
                                        int minim=0x7fffffff;
                           for(int nod=D;nod!=S;nod=T[nod])
                                 minim=min(minim,c[T[nod]][nod]-f[T[nod]][nod]);
                           flux+=minim;
                           for(int nod=D;nod!=S;nod=T[nod]){
                                                           f[T[nod]][nod]+=minim;
                                                           f[nod][T[nod]]-=minim;
                                                           }
                                                 }
}
  
int main()
{
 openIOFiles();
 scanf("%d%d",&n,&m);
 for (i=1;i<=m;++i) {
            scanf("%d%d%d",&x,&y,&aux);
            if (y==1) swap(x,y);
            if (x==n) swap(x,y);
            c[x][y]=aux;
            mem[x][y]=i;
            g[x].push_back(y);
            g[y].push_back(x);
            }
 S=1; D=n;
 dinic();
 for (i=1;i<=n;++i) 
   for (j=1;j<=n;++j)
     if (c[i][j]==f[i][j] && mem[i][j]>0) sol[mem[i][j]]=1;
 for (i=1;i<=n;++i) 
   if (sol[i]>0) ++solutie;
 printf("%d\n",solutie);
 for (i=1;i<=n;++i) 
   if (sol[i]>0) printf("%d\n",i);
 
 return 0;
}