Cod sursa(job #1050166)

Utilizator dariusdariusMarian Darius dariusdarius Data 8 decembrie 2013 12:06:30
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 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();
        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);
            }
        q.pop();
    }
    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())
    {
        int fmin=C[p[n]][n]-F[p[n]][n];
        for(int u=n;u!=1;u=p[u])
            fmin=min(fmin,C[p[u]][u]-F[p[u]][u]);
        for(int u=n;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;
}