포드 폴커슨 알고리즘!!!
분류없음 2011.01.24 00:22 |
오늘 새로 배운 알고리즘...
#include <stdio.h>
#define N 20
int n,A[N][N],MAX=9999,C[N]={0,};
int q(int s, int cnt)
{
C[cnt]=s;
if(s==2*n+2)// 정점도착 // C[cnt]에 현 위치(s) 저장
{
min=0x7fffffff;
for(i=2;i<=cnt;i++)//최솟값구하기
{
if(A[C[i-1]][C[i]]<min)
min=A[C[i-1]][C[i]];
}
for(i=2;i<=cnt;i++)//최솟값구하기
{
A[C[i-1]][C[i]]-=min;
}
for(i=cnt;i>=2;i--)
{
D[C[i]][C[i-1]]+=min;
}
return;
}
B[s]=1;// 현 위치 체킹
for(i=1;i<=2*n+2;i++)
{
if(A[s][i]!=0 && B[i]==0)
{
q(i,cnt+1);
}
}
B[s]=0;//조건에 맞는게 없다
}
void main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int i,j,k;
// 입력
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
A[1][i+1]=k;
}
for(i=1;i<=n;i++)
{
scanf("%d",&k);
A[n+i+1][2*n+2]=k;
}
for(i=2;i<=1+n;i++)
{
for(j=n+2;j<=n+5;j++)
{
A[i][j]=MAX;
}
}
// 입력
q(1,1);
}
이거 문제가 뭐냐면...
| 6 | 10 | |
| 12 | a | y |
| 4 | b | x |
a+y = 12
b+x = 4
a+b = 6
x+y = 10 에 맞게 숫자 채우기...
이 문제를 푸는 방법은 포드 폴커슨 이라는 방법이다.
http://en.wikipedia.org/wiki/Ford-Fulkerson_algorithm 에 들어가 보면 기본적인 정의는 나와있다.
간단하게 말하자면 재귀로 모든 경우의 수를 돌면서 유량이 넘치나 확인하고, 역으로 리턴 하면서 최솟값을 저장해 주는 방식이다.
한번 잘 분석해 보시길... ㅎㅎ

댓글을 달아 주세요