Cod sursa(job #1798435)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 5 noiembrie 2016 11:03:22
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
const int INF=1<<20;
int n,m,i,x,y,c,sol;
int ant[1<<10],rez[1<<10][1<<10];
bool a[1<<10],b[1<<10];
vector<int> V[1<<10];
vector <pair <int,int> > M;
bool bfs(int s,int d)
{
    bool viz[1<<10];
    memset(viz,0,sizeof viz);
    queue<int> q;
    viz[s]=1;
    q.push(s);
    ant[s]=s;
    while(!q.empty())
    {
        int nod=q.front();
        for(int i=0;i<V[nod].size();++i)
        {
            int x=V[nod][i];
            if(!viz[x]&&rez[nod][x]>0)
            {
                viz[x]=1;
                if(x==d) return 1;
                q.push(x);
                ant[x]=nod;
            }
        }
        q.pop();
    }
    return 0;
}
void solve()
{
    int s=1;
    int d=n;
    while(bfs(s,d))
    {
        for(int i=0;i<V[d].size();++i)
        {
            int nod=V[d][i];
            int maxFlow=INF;
            ant[d]=nod;
            for(int i=d;i!=ant[i];i=ant[i])
                maxFlow=min(maxFlow,rez[ant[i]][i]);
            for(int i=d;i!=ant[i];i=ant[i])
            {
                rez[ant[i]][i]-=maxFlow;
                rez[i][ant[i]]+=maxFlow;
            }
        }
    }
}
void search(int s,bool viz[])
{
    queue<int> q;
    viz[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int nod=q.front();
        for(int i=0;i<V[nod].size();++i)
        {
            int x=V[nod][i];
            if(!viz[x]&&rez[nod][x]>0&&rez[x][nod])
            {
                viz[x]=1;
                q.push(x);
            }
        }
        q.pop();
    }
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        M.push_back(make_pair(x,y));
        V[x].push_back(y);
        V[y].push_back(x);
        rez[x][y]=rez[y][x]=c;
    }
    solve();
    search(1,a);
    search(n,b);
    for(i=0;i<M.size();++i)
        if((a[M[i].first]&&b[M[i].second])||(a[M[i].second]&&b[M[i].first])) ++sol;
    g<<sol<<'\n';
    for(i=0;i<M.size();++i)
        if((a[M[i].first]&&b[M[i].second])||(a[M[i].second]&&b[M[i].first])) g<<i+1<<'\n';
    return 0;
}