Pagini recente » Cod sursa (job #1191119) | Cod sursa (job #2072665) | Cod sursa (job #1052721) | Cod sursa (job #1213596) | Cod sursa (job #606239)
Cod sursa(job #606239)
# include <fstream>
# include <cstring>
# include <vector>
# include <queue>
using namespace std;
ifstream f ("senat.in");
ofstream g ("senat.out");
vector <int> A[701];
int n, m, ind, s, F[701][701], C[701][701], start, finish, dmin[701], flow;
char sir[7000], c;
queue <int> Q;
int read (int &i, int s)
{
int nr = 0;
while (!(sir[i] >= '0' && sir[i] <= '9') && i < s) ++i;
while (sir[i] >= '0' && sir[i] <= '9' && i < s)
nr = nr * 10 + sir[i] - '0', ++i;
if (nr > 0) return nr;
}
int BFs ()
{
memset (dmin, 0, sizeof (dmin));
Q.push (start);
for (; !Q.empty (); Q.pop ())
{
int ret = Q.front ();
for (vector <int> :: iterator it = A[ret].begin (); it != A[ret].end (); ++it)
if (F[ret][*it] < C[ret][*it] && !dmin[*it])
dmin[*it] = ret, Q.push (*it);
}
return dmin[finish];
}
int main ()
{
f >> n >> m;
c = f.get ();
while (c != '\n') c = f.get ();
start = n + m + 2; finish = n + m + 1;
for (int i = 1; i <= n; ++i)
A[start].push_back (i), A[i].push_back (start), C[start][i] = 1;
for (int i = 1; i <= m; ++i)
{
f.get (sir, 6999);
c = f.get ();
while (c != '\n' && i != m) c = f.get ();
for (ind = 0, s = strlen (sir); ind < s; )
{
int nr = read (ind, s);
A[nr].push_back (i + n);
A[i + n].push_back (nr);
C[nr][i + n] = 1;
}
A[i + n].push_back (finish);
A[finish].push_back (i + n);
C[i + n][finish] = 1;
}
for (; BFs () > 0; )
{
for (vector <int> :: iterator it = A[finish].begin (); it != A[finish].end (); ++it)
{
if (F[*it][finish] < C[*it][finish] && dmin[*it])
{
int maxflow = C[*it][finish] - F[*it][finish];
for (int i = *it; i != start && maxflow > 0; i = dmin[i])
maxflow = min (maxflow, C[dmin[i]][i] - F[dmin[i]][i]);
if (!maxflow) continue ;
F[*it][finish] += maxflow;
F[finish][*it] -= maxflow;
for (int i = *it; i != start; i = dmin[i])
F[dmin[i]][i] += maxflow, F[i][dmin[i]] -= maxflow;
}
}
}
for (int i = n + 1, nm = n + m; i <= nm; ++i)
flow += F[i][finish];
if (flow != m)
g << "0\n";
else
{
for (int i = n + 1, nm = n + m; i <= nm; ++i)
{
for (int j = 1; j <= n; ++j)
if (F[j][i] > 0)
{
g << j << '\n';
break ;
}
}
}
g.close ();
return 0;
}