프 리 젠 테 이 션 및 응용 (oj 예제 설명 포함)
introduction
이 글 은 주로 의 진과 그 응용 을 쓴다.의 진의 등장 은 욕심 산법 때 문 이 아니 지만 욕심 산법 에서 매우 중요 한 위 치 를 차지한다.
일부 개념
두 가지 정리
가중 작성 진의 욕심 알고리즘
욕심 산법 을 사용 하여 가장 좋 은 문 제 를 얻 을 수 있 는 많은 문 제 는 가중 작성 진 에서 가장 큰 가중치 독립 부분 집합 을 찾 는 문제 로 형식 화 될 수 있다.즉, 가중 의 진 M = (S, T) 을 지정 합 니 다. 우 리 는 독립 집합 A * 8712 ° 8712 ° \ inT 를 찾 아 W (A) 를 가장 크게 만 들 고 싶 습 니 다.우 리 는 이런 독립 적 이 고 가장 큰 권한 을 가 진 부분 집합 을 의 진의 가장 좋 은 부분 집합 이 라 고 부른다.모든 요소 x * 8712 ° 8712 ° \ inS 의 가중치 가 정확 하기 때문에 가장 좋 은 부분 집합 은 반드시 최대 독립 자신 입 니 다. 이것 은 항상 A 를 가능 한 한 크게 하 는 데 도움 이 됩 니 다.
다음은 모든 가중 작성 진 에 적용 되 는 알고리즘 을 제시 합 니 다.
GREEDY(M,w)
A={}
sort M.S into monotonicially decreasing order weight w
for x in M.S, taken in monotonically decreasing order by weight w(x)
if A+{X} in M.T
A=A+{X}
return A
의 진의 욕심 알고리즘 의 정확성 도 greedy choice property 와 optimal substruture 두 가지 측면 에서 증명 되 었 다.다음은 우리 가 각각 증명 한다.
증명: 만약 에 A 가 M 의 임의의 x 를 포함 하 는 최대 가중치 독립 부분 집합 이 라면 A '= A - {x} 은 M' 의 독립 부분 집합 입 니 다.반면 모든 독립 부분 집합 A '는 M 의 독립 부분 집합 A = A' * 8746 ° 8746 ° \ cup {x} 을 생 성 할 수 있 습 니 다.두 가지 상황 에 대해 모두 w (A) = w (A ') + w (x) 가 있 기 때문에 M 의 x 를 포함 하 는 최대 가중치 부분 집합 은 반드시 M' 의 최대 가중치 부분 집합 을 생 성 할 것 이 고 그렇지 않 으 면 여전 하 다.
Example
최소 생 성 트 리 알고리즘
최소 생 성 트 리 문 제 는 무방 향 그림 에서 진행 된다.무방 향도 G = (V, E).
// poj 1258
#include
#include
using namespace std;
const int maxn=105;
struct Edge{
int u,v,w,key;
Edge(){}
Edge(int uu,int vv,int ww):u(uu),v(vv),w(ww){
key= 100000-ww;
}
bool operatorconst Edge& obj)const{
return key>obj.key;
}
}edge[maxn*maxn];
int f[maxn];
void Init(){
for(int i=0;iint Find(int x){
if(f[x]==x){
return x;
}else{
return f[x]=Find(f[x]);
}
}
void Union(int x,int y){
int fx=Find(x),fy=Find(y);
f[fy]=fx;
}
int main(int argc, char const *argv[])
{
int n;
while(~scanf("%d",&n)){
Init();
for(int i=0;ifor(int j=0;jint w;
scanf("%d",&w);
edge[i*n+j]=Edge(i,j,w);
}
}
sort(edge,edge+n*n);
long long int res=0;
int cnt=0;
for(int i=0;i1;i++){
int u=edge[i].u,fu=Find(u);
int v=edge[i].v,fv=Find(v);
int w=edge[i].w;
if(fu!=fv){
cnt++;
res+=w;
Union(u,v);
//printf("%d
",w);
}
}
printf("%lld
",res);
}
return 0;
}
Referenence
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.