Cod sursa(job #907112)

Utilizator lily3Moldovan Liliana lily3 Data 7 martie 2013 17:01:55
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<fstream>
#include<queue>
using namespace std;

int i,j,n,m,t[1001][1001],fl[1001][1001],flux,min1,aux;
int tata[1001],rez[1001],nr=0;
bool viz[1001];
queue<int> q;
struct costuri
{
    int x,y,cost;
};
costuri a[1001];
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];
}
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;
        }
    }

    int k;
    for(k=1;k<=m;++k)
    {
        ++t[a[k].x][a[k].y];
        ++t[a[k].y][a[k].x];
        aux=0;
    for(int t=1;t<=n;++t)
    for(int k=1;k<=n;++k)
    fl[t][k]=0;
     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;
            aux+=min1;
        }
    }
    --t[a[k].x][a[k].y];
    --t[a[k].y][a[k].x];
    if(aux!=flux)
    rez[++nr]=k;
    }
    g<<nr<<"\n";
    for(i=1;i<=nr;++i)
    g<<rez[i]<<"\n";
    return 0;
}