Cod sursa(job #907181)

Utilizator lily3Moldovan Liliana lily3 Data 7 martie 2013 18:13:38
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<fstream>
#include<algorithm>
#include<queue>
using namespace std;

int i,j,n,m,t[1001][1001],fl[1001][1001],flux,min1,aux;
int tata[1001],rez[100001],nr=0;
bool viz[1001];
queue<int> q;
struct costuri
{
    int x,y,cost;
};
costuri a[100001];
int bf()
{
    int i,x;
    for(i=1;i<=n;++i)
    viz[i]=0;
    q.push(1);
    while(!q.empty())
    {
        x=q.front();
        for(i=1;i<=n;++i)
        if(t[x][i]-fl[x][i]>0&&!viz[i])
        {
            viz[i]=1;
            tata[i]=x;
            q.push(i);
        }
        q.pop();
    }
    return viz[n];
}
bool saturat(int x,int y)
{
    if(max(fl[x][y],fl[y][x])==t[x][y])
    return 1;
    return 0;
}
void bf2(int x,int y)
{
    int i;
    q.push(x);
    tata[x]=x;
    while(!q.empty())
    {
        x=q.front();
        for(i=1;i<=n;++i)
        if(!tata[i]&&t[x][i]&&!saturat(x,i))
        {
            tata[i]=y;
            q.push(i);
        }
        q.pop();
    }
}
bool drum(int x,int y)
{
    if((tata[1]==tata[x]&&tata[y]==tata[n])||(tata[x]==tata[n]&&tata[1]==tata[y]))
    return 1;
    return 0;
}
int main()
{
    ifstream f("critice.in");
    ofstream g("critice.out");
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>a[i].x>>a[i].y>>a[i].cost;
        t[a[i].x][a[i].y]=t[a[i].y][a[i].x]=a[i].cost;
    }
    while(bf())
    {
        for(i=1;i<=n;++i)
        if(t[i][n]-fl[i][n]>0)
        {
            min1=t[i][n]-fl[i][n];
            for(j=i;j!=1;j=tata[j])
            if(t[tata[j]][j]-fl[tata[j]][j]<min1)
            min1=t[tata[j]][j]-fl[tata[j]][j];
            for(j=i;j!=1;j=tata[j])
            {
                fl[tata[j]][j]+=min1;
                fl[j][tata[j]]-=min1;
            }
            fl[i][n]+=min1;
            fl[n][i]-=min1;
            flux+=min1;
        }
    }
    for(i=1;i<=n;++i)
    tata[i]=0;
    for(i=1;i<=n;++i)
    if(!tata[i])
    bf2(i,i);

    for(i=1;i<=m;++i)
    if(saturat(a[i].x,a[i].y))
    if(drum(a[i].x,a[i].y))
    rez[++nr]=i;

    g<<nr<<"\n";
    for(i=1;i<=nr;++i)
    g<<rez[i]<<"\n";
    return 0;
}