1. 程式人生 > >貪心演算法之最大相容活動子集合問題

貪心演算法之最大相容活動子集合問題

問題:

     有n個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si <fi 。如果選擇了活動i,則它在半開時間區間[si, fi]內佔用資源。若區間[si, fi]與區間[sj, fj]不相交,則稱活動i與活動j是相容的。也就是說,當si≥fj或sj≥fi時,活動i與活動j相容。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了一個簡單、漂亮的方法使得儘可能多的活動能相容地使用公共資源。有n個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si <fi 。如果選擇了活動i,則它在半開時間區間[si, fi]內佔用資源。若區間[si, fi]與區間[sj, fj]不相交,則稱活動i與活動j是相容的。也就是說,當si≥fj或sj≥fi時,活動i與活動j相容。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了一個簡單、漂亮的方法使得儘可能多的活動能相容地使用公共資源。

程式碼:

#include<iostream>
#include<time.h>
#include<iomanip>
#include<fstream>
#include<algorithm>

using namespace std;

struct a{
    int si;//開始時間
    int fi;//結束時間
    int ii;//編號
};

bool compare(a x,a y){
    return x.fi<=y.fi;
}
int main(){
    cout<<"輸入活動數:";
    int m;
    cin>>m;
    a action[m];

    for(int i = 0; i < m; i++){
        cout<<"輸入第"<<i<<"活動的開始時間和結束時間";
        cin>>action[i].si>>action[i].fi;
        action[i].ii = i+1;
    }
    int num=1;
    int b[m];
    sort(action,action+m,compare);
    b[num++]=action[0].ii;
    int k=0;
    for(int i=1;i<m;i++){
        if(action[i].si>=action[k].fi){
            b[num++]=action[i].ii;
            k=i;
        }
    }
    ofstream fout;
    fout.open("output1.txt");
    for(int i=0;i<num;i++)
        fout<<b[i]<<' ';

    return 0;

}