Cod sursa(job #253210)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 15:57:48
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.65 kb
 using namespace std;  
   
 #include <set>  
 #include <map>  
 #include <list>  
 #include <deque>  
 #include <stack>  
 #include <queue>  
 #include <cmath>  
 #include <cstdio>  
 #include <vector>  
 #include <string>  
 #include <bitset>  
 #include <cstdlib>  
 #include <utility>  
 #include <algorithm>  
 #include <functional>  
   
 #define pb push_back  
 #define sz size  
 #define f first  
 #define s second  
 #define II inline  
 #define ll long long  
 #define db double  
 #define FOR(i,a,b) for(int i=a;i<=b;++i)  
 #define all(v) v.begin() , v.end()  
 #define C(v) memset((v),0,sizeof((v)))  
 #define FORit(it,v) for(it = (v).begin();it != (v).end();++it)  
 #define mp make_pair  
   
 #define IN  "critice.in"  
 #define OUT "critice.out"  
 #define N_MAX 1<<10  
   
 typedef vector< pair<int,int> > VI;  
 typedef vector< vector <int> > VM;  
 typedef vector<string> VS;  
   
 int S,D,N,M;  
 vector< vector<int> > A(N_MAX);  
 int T[N_MAX],C[N_MAX][N_MAX];  
 bool viz[N_MAX];  
 VI MV;  
   
 II void scan()  
 {  
     int x,y,c;  
     freopen(IN,"r",stdin);  
     freopen(OUT,"w",stdout);  
       
     scanf("%d%d",&N,&M);  
     FOR(i,1,M)  
     {  
         scanf("%d%d%d\n",&x,&y,&c);  
         A[x].pb(y);  
         A[y].pb(x);  
         C[x][y] = C[y][x] = c;  
         MV.pb( mp(x,y) );  
     }     
     S=1;  
     D=N;  
 }  
   
 II void BF(int start)  
 {  
     int stv[N_MAX];  
     stv[0] = 1;  
     stv[1] = start;  
     viz[start] = true;  
     FOR(i,1,stv[0])  
     {  
         int nod = stv[i];  
         int l = A[nod].sz() - 1;  
         FOR(j,0,l)  
         {  
             int next = A[nod][j];  
             if(!viz[next] && C[nod][next])  
             {  
                 viz[next] = true;  
                 T[next] = nod;  
                 stv[++stv[0]] = next;  
             }  
         }  
     }     
 }  
   
 II int flux()  
 {  
     int r(1<<30);  
     C(viz);  
     viz[S] = true;  
     T[D] = 0;  
     BF(S);  
     if(!T[D])  
         return 0;  
       
     for(int j=N;j!=S;j = T[j])  
         r = min(r, C[ T[j] ][j]);  
     for(int j=N; j!= S; j = T[j])  
     {  
         C[ T[j] ][j] -= r;  
         C[j][ T[j] ] += r;  
     }  
     return 1;  
 }  
   
 II void solve()  
 {  
     for(;flux(););  
     vector<int> sol;  
     int stv[N_MAX];  
     bool vizS[N_MAX],vizD[N_MAX];  
     C(vizS),C(vizD);  
       
     stv[stv[0]=1] = S;  
     vizS[S] = true;  
     FOR(i,1,stv[0])  
     {  
         int nod = stv[i];  
         int l = A[nod].sz() - 1;  
         FOR(j,0,l)  
         {  
             int next = A[nod][j];  
             if(!vizS[next] && C[nod][next])  
                 vizS[next] = true,  
                 stv[++stv[0]] = next;  
         }  
     }     
       
     stv[stv[0]=1] = D;  
     vizD[D] = true;  
     FOR(i,1,stv[0])  
     {  
         int nod = stv[i];  
         int l = A[nod].sz() - 1;  
         FOR(j,0,l)  
         {  
             int next = A[nod][j];  
             if(!vizD[next] && C[next][nod])  
                 vizD[next] = true,  
                 stv[++stv[0]] = next;  
         }  
     }     
       
     FOR(i,0,M-1)  
         if( (vizS[ MV[i].f ] && vizD[ MV[i].s] && !C[ MV[i].f ][ MV[i].s ]) || (vizS[ MV[i].s ] && vizD[ MV[i].f ] && !C[ MV[i].s ][ MV[i].f ]) )  
             sol.pb(i+1);  
       
     int l = sol.sz()-1;   
     printf("%d\n",l+1);  
     FOR(i,0,l)  
         printf("%d\n",sol[i]);  
 }  
   
 int main()  
 {  
     scan();  
     solve();  
     return 0;  
}