Pagini recente » Evacuare | Istoria paginii utilizator/negru_diana | Cod sursa (job #103579) | Cod sursa (job #2593558) | Cod sursa (job #578736)
Cod sursa(job #578736)
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define pb push_back
#define INF 0x3f3f3f3f
#define DIM 405
int cst[DIM][DIM],c[DIM][DIM],f[DIM][DIM];
int dst[DIM],t[DIM];
int N,SRC,DST,cost;
bool viz[DIM];
vector <int> g[DIM];
queue <int> q;
void read ()
{
int i,j,x;
scanf ("%d",&N);
for (i=1; i<=N; ++i)
for (j=1; j<=N; ++j)
{
scanf ("%d",&x);
c[i][j+N]=1;
g[i].pb (j+N);
g[j+N].pb (i);
cst[i][j+N]=x;
cst[j+N][i]=-x;
}
}
inline int bellman_ford (int SRC)
{
vector <int> :: iterator it;
int nod;
memset (dst,INF,sizeof (dst));
memset (viz,0,sizeof (viz));
memset (t,-1,sizeof (t));
dst[SRC]=0;
for (q.push (SRC); !q.empty (); q.pop ())
{
nod=q.front (); viz[nod]=0;
for (it=g[nod].begin (); it!=g[nod].end (); ++it)
if (dst[nod]+cst[nod][*it]<dst[*it] && c[nod][*it]!=f[nod][*it])
{
dst[*it]=dst[nod]+cst[nod][*it];
t[*it]=nod;
if (!viz[*it])
{
viz[*it]=1;
q.push (*it);
}
}
}
if (t[DST]==-1)
return 0;
return 1;
}
void solve ()
{
int i;
SRC=0; DST=(N<<1)+1;
for (i=1; i<=N; ++i)
{
c[SRC][i]=1;
g[SRC].pb (i);
g[i].pb (SRC);
c[i+N][DST]=1;
g[i+N].pb (DST);
g[DST].pb (i+N);
}
while (bellman_ford (SRC))
{
cost+=dst[DST];
for (i=DST; i!=SRC; i=t[i])
{
++f[t[i]][i];
--f[i][t[i]];
}
}
}
void print ()
{
int i,j,cnt;
printf ("%d\n",cost);
for (i=1; i<=N;++i)
{
bellman_ford (i+N);
cnt=0;
for (j=1; j<=N; ++j)
if (!(dst[j]+cst[j][i+N]))
++cnt;
printf ("%d ",cnt);
for (j=1; j<=N; ++j)
if (!(dst[j]+cst[j][i+N]))
printf ("%d ",j);
printf ("\n");
}
}
int main ()
{
freopen ("paznici2.in","r",stdin);
freopen ("paznici2.out","w",stdout);
read ();
solve ();
print ();
return 0;
}