Pagini recente » Cod sursa (job #2735665) | Cod sursa (job #3220757) | Cod sursa (job #2850499) | Cod sursa (job #1629205) | Cod sursa (job #134156)
Cod sursa(job #134156)
using namespace std;
#include <cstdio>
#include <string>
#include <queue>
#define maxn 402
#define oo 0x3f3f3f3f
int cost[maxn][maxn],c[maxn][maxn],C[maxn][maxn],d[maxn],t[maxn];
int source, sink;
int n;
int l[maxn], r[maxn];
bool use[maxn];
int S[201][201];
void read()
{
freopen("paznici2.in","r",stdin);
scanf("%d\n", &n);
int i, j, p;
source=0;
sink=2*n+1;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
scanf("%d ", &p);
cost[i][j+n]=p;
cost[j+n][i]=-p;
c[i][j+n]=1;
C[i][j+n]=1;
}
for(i=1;i<=n;++i) cost[source][i]=0, c[source][i]=1, C[source][i]=1;
for(i=n+1;i<=(n<<1);++i) cost[i][sink]=0, c[i][sink]=1, C[i][sink]=1;
}
inline int bellman()
{
queue<int>Q;
int u, i;
memset(d, oo, sizeof(d));
memset(t, 0, sizeof(t));
d[source]=0;
Q.push(source);
while(!Q.empty())
{
u=Q.front();
Q.pop();
for(i=source;i<=sink;++i)
if(c[u][i])
if(d[u]+cost[u][i]<d[i])
{
d[i]=d[u]+cost[u][i];
Q.push(i);
t[i]=u;
}
}
if(d[sink]==oo) return 0;
for(i=sink; i!=source; i=t[i])
{
c[t[i]][i]=0;
c[i][t[i]]=1;
}
return 1;
}
inline int bell(int A, int B)
{
queue<int>Q;
int u, i;
memset(d, oo, sizeof(d));
memset(t, 0, sizeof(t));
bool isq[maxn];
memset(isq, 0, sizeof(isq));
d[source]=0;
Q.push(source);
isq[source]=1;
while(!Q.empty())
{
u=Q.front();
isq[u]=0;
Q.pop();
if(u==A) continue;
if(u==B) continue;
for(i=source;i<=sink;++i)
if(c[u][i] && i!=A && i!=B)
{
if(i==A) continue;
if(i==B) continue;
if(d[u]+cost[u][i]<d[i])
{
d[i]=d[u]+cost[u][i];
if(!isq[i]){
Q.push(i);
isq[i]=1;}
t[i]=u;
}
}
}
if(d[sink]==oo) return 0;
for(i=sink; i!=source; i=t[i])
{
c[t[i]][i]=0;
c[i][t[i]]=1;
}
return 1;
}
void solve()
{
while(bellman());
int i, j,sol=0;
for(i=1;i<=n;++i)
for(j=n+1;j<sink;++j)
if(!c[i][j])
{
l[j]=i;
r[i]=j;
sol+=cost[i][j];
}
int k, t,s=0;
for(i=1;i<=n;++i)
for(j=n+1;j<sink;++j)
{
for(k=source;k<=sink;++k)
for(t=source;t<=sink;++t) c[k][t]=C[k][t];
while(bell(i,j));
s=cost[i][j];
r[i]=j;
c[i][j]=1;
for(k=1;k<=n;++k)
for(t=n+1;t<sink;++t)
if(!c[k][t])
{
s+=cost[k][t],r[k]=t;
}
if(s==sol)
{
for(k=1;k<=n;++k) if(r[k]>n) r[k]-=n;
for(k=1;k<=n;++k){/* printf("%d ", r[k]);*/S[k][r[k]]=1;}
// printf("\n");
}
}
int nr;
freopen("paznici2.out","w",stdout);
printf("%d\n", sol);
for(i=1;i<=n;++i)
{
nr=0;
for(j=1;j<=n;++j) if(S[i][j]) ++nr;
printf("%d ", nr);
for(j=1;j<=n;++j) if(S[i][j]) printf("%d ", j);
printf("\n");
}
}
int main()
{
read();
solve();
return 0;
}