Cod sursa(job #2008110)

Utilizator victoreVictor Popa victore Data 5 august 2017 13:17:07
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;

const int nmax=1005;

typedef pair<int,int> ii;

ii muc[10*nmax];
int top,cap[nmax][nmax],flux[nmax][nmax],tata[nmax],st[nmax];
bool viz1[nmax],viz2[nmax];
int n,m;
vector<int> g[nmax];

inline bool bfs()
{
    queue<int> q;
    q.push(1);
    memset(tata,0,sizeof(tata));
    tata[1]=-1;
    int cnode,i,node;
    while(!q.empty())
    {
        node=q.front();
        q.pop();
        if(node==n)
            return 1;
        for(i=0;i<g[node].size();++i)
        {
            cnode=g[node][i];
            if(!tata[cnode] && cap[node][cnode] > flux[node][cnode])
            {
                tata[cnode]=node;
                q.push(cnode);
            }
        }
    }
    return 0;
}

inline void bfs0(int start,bool viz[])
{
    int i,j;
    queue<int> q;
    q.push(start);
    viz[start]=1;
    int node,cnode;
    while(!q.empty())
    {
        node=q.front();
        q.pop();
        for(i=0;i<g[node].size();++i)
        {
            cnode=g[node][i];
            if(viz[cnode] || cap[node][cnode] == flux[node][cnode] || cap[cnode][node] == flux[cnode][node])
                continue;
            viz[cnode]=1;
            q.push(cnode);
        }
    }
}

int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    int i,x,y,c,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        g[x].push_back(y);
        g[y].push_back(x);
        cap[x][y]=c;
        cap[y][x]=c;
        muc[i].first=x;
        muc[i].second=y;
    }
    int cnode,mflux=0;
    while(bfs())
    {
        for(i=0;i<g[n].size();++i)
        {
            cnode=g[n][i];
            if(tata[cnode] && cap[cnode][n] > flux[cnode][n])
            {
                tata[n]=cnode;
                int cflux=2e9;
                for(j=n;j!=1;j=tata[j])
                    cflux=min(cflux,cap[tata[j]][j] - flux[tata[j]][j]);
                for(j=n;j!=1;j=tata[j])
                {
                    flux[tata[j]][j]+=cflux;
                    flux[j][tata[j]]-=cflux;
                }
                mflux+=cflux;
            }
        }
    }
    bfs0(1,viz1);
    bfs0(n,viz2);
    for(i=1;i<=m;++i)
        if( (viz1[muc[i].first] && viz2[muc[i].second]) || (viz2[muc[i].first] && viz1[muc[i].second]) )
            st[++top]=i;
    printf("%d\n",top);
    for(i=1;i<=top;++i)
        printf("%d\n",st[i]);
}