Cod sursa(job #1763821)

Utilizator LucianTLucian Trepteanu LucianT Data 24 septembrie 2016 17:28:01
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <bits/stdc++.h>
#define maxN 1005
#define INF (1<<30)
using namespace std;
int t[maxN];
queue<int> Que;
bool seen[maxN],vis[3][maxN];
vector<int>v[maxN],sol;
vector<pair<int,int> >edge;
int maxflow,addflow,nod;
int n,m,i,j,x,y,z,source,sink;
int cap[maxN][maxN],flow[maxN][maxN];
bool bfs()
{
    memset(seen,false,sizeof(seen));
    seen[source]=true;
    Que.push(source);
    while(!Que.empty())
    {
        int node=Que.front();
        Que.pop();
        if(node==sink)
            continue;
        for(vector<int>::iterator it=v[node].begin();it!=v[node].end();it++)
        {
            if(seen[*it] || flow[node][*it]>=cap[node][*it])
                continue;
            t[*it]=node;
            seen[*it]=true;
            Que.push(*it);
        }
    }
    return seen[sink];
}
void dfs(int ind,int node)
{
    vis[ind][node]=true;
    for(vector<int>::iterator it=v[node].begin();it!=v[node].end();it++)
        if(!vis[ind][*it] && flow[node][*it]!=cap[node][*it] && flow[*it][node]!=cap[*it][node])
            dfs(ind,*it);
}
int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    scanf("%d %d",&n,&m);
    source=1,sink=n;
    for(i=1;i<=m;i++)
        scanf("%d %d %d",&x,&y,&z),
        v[x].push_back(y),
        v[y].push_back(x),
        cap[x][y]=cap[y][x]=z,
        edge.push_back(make_pair(x,y));
    while(bfs())
        for(vector<int>::iterator pr=v[sink].begin();pr!=v[sink].end();pr++)
            if(seen[*pr])
            {
                t[sink]=*pr;
                addflow=INF;
                for(nod=sink;nod!=source;nod=t[nod])
                    addflow=min(addflow,cap[t[nod]][nod]-flow[t[nod]][nod]);
                for(nod=sink;nod!=source;nod=t[nod])
                    flow[t[nod]][nod]+=addflow,
                    flow[nod][t[nod]]-=addflow;
            }
    dfs(1,source);
    dfs(2,sink);
    for(size_t i=0;i<edge.size();i++)
    {
        x=edge[i].first;
        y=edge[i].second;
        if(vis[1][x]&&vis[2][y] || vis[2][x]&&vis[1][y])
            sol.push_back(i+1);
    }
    printf("%d\n",sol.size());
    for(size_t i=0;i<sol.size();i++)
        printf("%d\n",sol[i]);
    return 0;
}