네트워크 플로우에 대해 공부하고 풀어야 할 문제
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 405
#define INF 987654321
#define MOD 1000000
typedef long long ll;
#pragma warning(disable:4996)
using namespace std;
int n,m,a,b,c,st=401,dest=402,total=0,flow[2][MAX][MAX];
vector<int> v[MAX];
queue<int> q;
bool visit[MAX][MAX],tf[MAX];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
flow[1][401][i]=1;
v[401].push_back(i);
scanf("%d",&a);
for(int k=0;k<a;k++)
{
scanf("%d",&b);
flow[1][i][b+200]=1;
if(tf[b+200]==false)
{
flow[1][b+200][402]=1;
v[b+200].push_back(402);
tf[b+200]=true;
}
v[i].push_back(b+200);
v[b+200].push_back(i);
}
}
while(1)
{
int prev[MAX];
fill_n(&prev[0],MAX,-1);
q.push(st);
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int k=0;k<v[cur].size();k++)
{
if(prev[v[cur][k]]==-1&&flow[1][cur][v[cur][k]]-flow[0][cur][v[cur][k0)
{
prev[v[cur][k]]=cur;
q.push(v[cur][k]);
if(v[cur][k]==dest)
break;
}
}
}
if(prev[dest]==-1)
break;
int tmp=dest;
while(tmp!=st)
{
flow[0][prev[tmp]][tmp]+=1;
flow[0][tmp][prev[tmp]]-=1;
tmp=prev[tmp];
}
total++;
}
printf("%d\n",total);
return 0;
}
'IT > BOJ' 카테고리의 다른 글
| 백준(BOJ) 3190 뱀 ** (0) | 2018.06.01 |
|---|---|
| 백준(BOJ) 3048 개미 * (0) | 2018.06.01 |
| 백준(BOJ) 6086 최대 유량 *** (0) | 2018.06.01 |
| 백준(BOJ) 5676 음주코딩 ** (0) | 2018.06.01 |
| 백준(BOJ) 11505 구간 곱 구하기 * (0) | 2018.06.01 |