国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

采用C++實(shí)現(xiàn)區(qū)間圖著色問題(貪心算法)實(shí)例詳解

2020-01-26 15:26:52
字體:
供稿:網(wǎng)友

本文所述算法即假設(shè)要用很多個(gè)教室對一組活動(dòng)進(jìn)行調(diào)度。我們希望使用盡可能少的教室來調(diào)度所有活動(dòng)。采用C++的貪心算法,來確定哪一個(gè)活動(dòng)使用哪一間教室。

對于這個(gè)問題也常被稱為區(qū)間圖著色問題,即相容的活動(dòng)著同色,不相容的著不同顏色,使得所用顏色數(shù)最少。

具體實(shí)現(xiàn)代碼如下:

//貪心算法#include "stdafx.h"#include<iostream>#define N 100using namespace std;struct Activity{ int number; //活動(dòng)編號(hào) int begin; //活動(dòng)開始時(shí)間 int end; //活動(dòng)結(jié)束時(shí)間 bool flag;//此活動(dòng)是否被選擇 int roomNum; //此活動(dòng)在哪間教室舉行};//對于活動(dòng)集,按照結(jié)束時(shí)間遞增排序,使用快速排序void fast_sort(Activity *act,int f,int t){ if(f<t) { int i = f-1,j = f; Activity a = act[t]; while(j<t) {  if(act[j].end<=a.end)  {  i++;  Activity temp1 = act[i];  act[i] = act[j];  act[j] = temp1;  }  j++; } Activity temp2 = act[t]; act[t] = act[i+1]; act[i+1] = temp2; fast_sort(act,f,i); fast_sort(act,i+2,t); }}//把每一個(gè)相容的活動(dòng)集添加到一個(gè)教室,使得教室數(shù)目最少int select_room(Activity *act,int *time,int n){ int i = 1; int j = 1; int sumRoom; //目前所用的教室數(shù)目 sumRoom = 1;  int sumAct; //目前有多少活動(dòng)被選擇了 sumAct = 1;  //教室1目前最晚時(shí)間為排在最前面的活動(dòng)的結(jié)束時(shí)間 time[1] = act[0].end;  //最先結(jié)束的活動(dòng)放在教室1中 act[0].roomNum = 1;  for(i=1;i<n;i++) { for(j=1;j<=sumRoom;j++) {  //如果活動(dòng)act[i]的開始時(shí)間大于等于j教室目前的最晚結(jié)束時(shí)間且此活動(dòng)還沒有被選擇,  //則此活動(dòng)與目前這間教室里面的活動(dòng)是兼容的,可以加入進(jìn)去  if((act[i].begin>=time[j])&&(!act[i].flag))  {  //此活動(dòng)的教室號(hào)碼  act[i].roomNum = j;  //此活動(dòng)被選擇  act[i].flag = true;  //更新此教室的最晚時(shí)間  time[j] = act[i].end;  //被選擇的活動(dòng)數(shù)目加1  sumAct ++;  } } //說明活動(dòng)沒有全部被選擇,而所有活動(dòng)都遍歷一遍 //所以需要再加一個(gè)教室,從頭再遍歷 if(sumAct<n&&i==n-1) {  //從頭開始遍歷  i = 0;  //教室數(shù)目加1  sumRoom = sumRoom+1; } } return sumRoom;}int _tmain(int argc, _TCHAR* argv[]){ int cases; Activity act[N]; //用來記錄每個(gè)教室目前最晚完成的活動(dòng)的結(jié)束時(shí)間 int time[N]; cout<<"請輸入案例的個(gè)數(shù):"<<endl; cin>>cases; while(cases--) { int n; cout<<"請輸入活動(dòng)的數(shù)目:"<<endl; cin>>n; int i; for(i=0;i<n;i++) {  time[i+1] = 0; //初始化每個(gè)教室目前最晚的時(shí)間為0  act[i].number = i+1;  act[i].flag = false;  //初始化每個(gè)活動(dòng)都未被選擇  act[i].roomNum = 0; //初始化每個(gè)活動(dòng)都占用教室  cout<<"活動(dòng)"<<i+1<<"開始時(shí)間:";  cin>>act[i].begin;  cout<<"活動(dòng)"<<i+1<<"結(jié)束時(shí)間:";  cin>>act[i].end; } fast_sort(act,0,n-1); int roomNum =select_room(act,time,n); cout<<"所用教室總數(shù)為:"<<roomNum<<endl; cout<<"每個(gè)活動(dòng)在哪一個(gè)教室中:"<<endl; for(i=0;i<n;i++) {  cout<<"活動(dòng)"<<act[i].number<<"在教室"<<act[i].roomNum<<"中"<<endl; } } system("pause"); return 0;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汾阳市| 宽城| 镶黄旗| 辽阳县| 新密市| 石棉县| 舒兰市| 屯昌县| 堆龙德庆县| 察雅县| 驻马店市| 东乡族自治县| 马关县| 安乡县| 武汉市| 庆阳市| 治县。| 铅山县| 大洼县| 鲁山县| 霍城县| 肇东市| 江津市| 百色市| 渭源县| 镇安县| 澳门| 石门县| 潞西市| 东乡族自治县| 泗阳县| 吉首市| 克什克腾旗| 淄博市| 深圳市| 柳林县| 柳林县| 鄂温| 沙雅县| 礼泉县| 梧州市|