Cod sursa(job #474853)

Utilizator freak93Adrian Budau freak93 Data 5 august 2010 11:37:07
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>

using namespace std;

const char iname[]="paznici2.in";
const char oname[]="paznici2.out";
const int maxn=405;
const int inf=0x3f3f3f3f;
ifstream f(iname);
ofstream g(oname);

int cost[maxn][maxn],C[maxn][maxn],F[maxn][maxn],i,j,n,S,D;
int dis[maxn],A[maxn],rez,ans,been[maxn];
vector<int> E[maxn];
queue<int> Q;

int BF(int S)
{
    memset(A,-1,sizeof(A));
    memset(dis,inf,sizeof(dis));
    memset(been,0,sizeof(been));
    dis[S]=0;
    Q.push(S);
    been[S]=1;
    while(!Q.empty())
    {
        int x=Q.front();
        Q.pop();
        been[x]=0;
        for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
            if(F[x][*it]<C[x][*it]&&dis[x]+cost[x][*it]<dis[*it])
            {
                dis[*it]=dis[x]+cost[x][*it],A[*it]=x;
                if(been[*it]==0)
                    been[*it]=1,Q.push(*it);
            }
    }
    return (dis[D]!=inf);
}

int main()
{
    f>>n;
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            f>>cost[i][j+n],cost[j+n][i]=-cost[i][j+n],C[i][j+n]=1,E[i].push_back(j+n),E[j+n].push_back(i);
    S=0;
    D=2*n+1;
    for(i=1;i<=n;++i)
        C[S][i]=1,E[S].push_back(i),E[i].push_back(S),
        C[i+n][D]=1,E[D].push_back(i+n),E[i+n].push_back(D);

    while(BF(S))
    {
        rez+=dis[D];
        for(i=D;i!=S;i=A[i])
            ++F[A[i]][i],--F[i][A[i]];
    }
    g<<rez<<"\n";
    for(i=n+1;i<=n+n;++i)
    {
        BF(i);
        ans=0;
        for(j=1;j<=n;++j)
            if(dis[j]+cost[j][i]==0)
                ++ans;
        g<<ans<<" ";
        for(j=1;j<=n;++j)
            if(dis[j]+cost[j][i]==0)
                g<<j<<" ";
        g<<"\n";
    }
}