네트워크 플로우에 대해 공부하고 풀어야 할 문제
#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 |