Pagini recente » Cod sursa (job #2762414) | Cod sursa (job #1145895) | Cod sursa (job #2865776) | Cod sursa (job #1276024) | Cod sursa (job #474853)
Cod sursa(job #474853)
#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";
}
}