Cod sursa(job #1050168)

Utilizator dariusdariusMarian Darius dariusdarius Data 8 decembrie 2013 12:10:00
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct Edge
{
    int x,y;
} a[10005];
typedef vector<int> Graf[1005];
Graf G,R,T;
int C[1005][1005];
int F[1005][1005];
int n,m,d[1005],p[1005];
bool v1[1005],v2[1005];
bool bfs()
{
    memset(d,0,sizeof(d));
    memset(p,0,sizeof(p));
    queue<int> q;
    q.push(1);d[1]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        if(u==n) continue;
        for(vector<int>::iterator it=G[u].begin();it!=G[u].end();it++)
            if(F[u][*it]<C[u][*it] && !d[*it])
            {
                d[*it]=d[u]+1;
                p[*it]=u;
                q.push(*it);
            }
    }
    if(d[n])
        return true;
    return false;
}
void dfs(int u,bool viz[1005],const Graf &G)
{
    viz[u]=true;
    for(vector<int>::const_iterator it=G[u].begin();it!=G[u].end();it++)
        if(!viz[*it])
            dfs(*it,viz,G);
}
int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int c,i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a[i].x,&a[i].y,&c);
        G[a[i].x].push_back(a[i].y);
        G[a[i].y].push_back(a[i].x);
        C[a[i].x][a[i].y]=C[a[i].y][a[i].x]=c;
    }
    while(bfs())
        for(vector<int>::iterator it=G[n].begin();it!=G[n].end();it++)
            if(d[*it] && F[*it][n]<C[*it][n])
            {
                int fmin=C[*it][n]-F[*it][n];
                for(int u=*it;u!=1;u=p[u])
                    fmin=min(fmin,C[p[u]][u]-F[p[u]][u]);
                F[*it][n]+=fmin;
                F[n][*it]-=fmin;
                for(int u=*it;u!=1;u=p[u])
                {
                    F[p[u]][u]+=fmin;
                    F[u][p[u]]-=fmin;
                }
            }
    ///for(int i=1;i<=m;i++)
    ///    printf("%d %d: %d/%d\n",a[i].x,a[i].y,F[a[i].x][a[i].y],C[a[i].x][a[i].y]);
    for(int i=1;i<=m;i++)
    {
        if(F[a[i].x][a[i].y]<C[a[i].x][a[i].y])
            R[a[i].x].push_back(a[i].y),
            T[a[i].y].push_back(a[i].x);
        if(F[a[i].y][a[i].x]<C[a[i].y][a[i].x])
            R[a[i].y].push_back(a[i].x),
            T[a[i].x].push_back(a[i].y);
    }
    dfs(1,v1,R);
    dfs(n,v2,T);
    vector<int> sol;
    for(int i=1;i<=m;i++)
    {
        if(F[a[i].x][a[i].y]==C[a[i].x][a[i].y] && v1[a[i].x] && v2[a[i].y])
            sol.push_back(i);
        if(F[a[i].y][a[i].x]==C[a[i].y][a[i].x] && v1[a[i].y] && v2[a[i].x])
            sol.push_back(i);
    }
    printf("%d\n",(int)sol.size());
    for(int i=0;i<(int)sol.size();i++)
        printf("%d\n",sol[i]);
    return 0;
}