Pagini recente » Cod sursa (job #1301314) | Profil Ovidiu-Antonio | Cod sursa (job #136674) | Cod sursa (job #2252308) | Cod sursa (job #263225)
Cod sursa(job #263225)
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <vector>
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define MAX 10010
using namespace std;
int testCases, nrSour, nrDest, nrEdges;
int vctDr[MAX], vctSt[MAX], sel[MAX];
vector <pair <int, int> > vctDrum;
vector <int> listDrum[MAX];
int cupleaza(int nod)
{
if (sel[nod])
return 0;
sel[nod] = 1;
for (int i = 0; i < listDrum[nod].size(); i++)
if (!vctSt[listDrum[nod][i]] || cupleaza(listDrum[nod][i]))
{
vctSt[listDrum[nod][i]] = nod;
vctDr[nod] = listDrum[nod][i];
return 1;
}
return 0;
}
int main()
{
freopen("java.in", "r", stdin);
freopen("java.out", "w", stdout);
for (scanf("%d", &testCases), testCases = 1; testCases;
memset(vctDr, 0, sizeof(vctDr)), memset(vctSt, 0, sizeof(vctSt)), testCases--)
{
scanf("%d %d %d", &nrSour, &nrDest, &nrEdges);
vctDrum.erase(vctDrum.begin(), vctDrum.end());
for (int i = 0; i < nrEdges; i++)
{
int t, f;
scanf("%d %d", &t, &f);
vctDrum.pb(mp(t, f));
}
sort(vctDrum.begin(), vctDrum.end());
listDrum[vctDrum[0].f].pb(vctDrum[0].s);
for (int i = 0; i < nrEdges; i++)
if (vctDrum[i] != vctDrum[i - 1])
listDrum[vctDrum[i].f].pb(vctDrum[i].s);
for (int ok = 1, i; ok; memset(sel, 0, sizeof(sel)))
for (i = 1, ok = 0; i <= nrSour; i++)
if (!vctDr[i])
ok |= cupleaza(i);
int sol = 0;
for (int i = 1; i <= nrSour; i++)
{
listDrum[i].erase(listDrum[i].begin(), listDrum[i].end());
if (vctDr[i])
sol++;
}
printf("%d\n", sol);
}
fclose(stdin);
fclose(stdout);
return 0;
}