Cod sursa(job #1154935)

Utilizator misinozzz zzz misino Data 26 martie 2014 14:57:30
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define N 1010
#define M 10010
#define INF 0X3f3f3f3f
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m,i,x,y,d,mini,nod,nrsol,sol[M],t[N],viz[N],viz1[N],viz2[N],cap[N][N],fl[N][N];
vector<int>v[N];
pair<int,int>mu[M];
queue<int>q;
inline bool bfs(){
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    q.push(1);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        if(x==n)
        continue;
        for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
        if(cap[x][*it]-fl[x][*it]>0&&!viz[*it])
        {
            viz[*it]=1;
            q.push(*it);
            t[*it]=x;
        }
    }
    return viz[n];
}
inline void fa_flux(){
    while(bfs())
    {
        for(vector<int>::iterator it=v[n].begin();it!=v[n].end();++it)
        if(viz[*it]&&cap[*it][n]-fl[*it][n]>0)
        {
            t[n]=*it;
            mini=INF;
            nod=n;
            while(nod!=1)
            {
                mini=min(mini,cap[t[nod]][nod]-fl[t[nod]][nod]);
                nod=t[nod];
            }
            if(!mini)
            continue;
            nod=n;
            while(nod!=1)
            {
                fl[t[nod]][nod]+=mini;
                fl[nod][t[nod]]-=mini;
                nod=t[nod];
            }
        }
    }
}
inline void dfs(int x,int viz[]){
    viz[x]=1;
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
    if(!viz[*it]&&fl[x][*it]!=cap[x][*it]&&fl[x][*it]!=-cap[x][*it])
    dfs(*it,viz);
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>d;
        cap[x][y]=cap[y][x]=d;
        v[x].push_back(y);
        v[y].push_back(x);
        mu[i]=make_pair(x,y);
    }
    fa_flux();
    dfs(1,viz1);
    dfs(n,viz2);
    for(i=1;i<=m;++i)
    if(viz1[mu[i].first]&&viz2[mu[i].second]||viz1[mu[i].second]&&viz2[mu[i].first])
    if(fl[mu[i].first][mu[i].second]==cap[mu[i].first][mu[i].second]||fl[mu[i].second][mu[i].first]==cap[mu[i].first][mu[i].second])
    sol[++nrsol]=i;
    g<<nrsol<<'\n';
    for(i=1;i<=nrsol;++i)
    g<<sol[i]<<'\n';
    return 0;
}