오늘 새로 배운 알고리즘...
#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

a+y = 12
b+x = 4
a+b = 6
x+y = 10 에 맞게 숫자 채우기...

이 문제를 푸는 방법은 포드 폴커슨 이라는 방법이다.
http://en.wikipedia.org/wiki/Ford-Fulkerson_algorithm 에 들어가 보면 기본적인 정의는 나와있다.

간단하게 말하자면 재귀로 모든 경우의 수를 돌면서 유량이 넘치나 확인하고, 역으로 리턴 하면서 최솟값을 저장해 주는 방식이다.

한번 잘 분석해 보시길... ㅎㅎ

Posted by 들아군

댓글을 달아 주세요

티스토리 툴바