1. 程式人生 > >任務排程和最小生成樹

任務排程和最小生成樹

排程問題:

問題背景:一個共享資源,多個job要訪問。 question:那我們應該如何排列job的順序 假定:每個job 有優先順序 ,和需要使用資源的時間長度當我們排列所有job之後,每個job都會有一個開始時間和結束時間,那麼如何評定一個方案是不是好方案 ,/[ c_{i} /] 指的是任務最後完成時間 /[ \min \left( \sum_{i=1}^{n}c_{i}w_{i}\right)  /] ok 那麼,我們的演算法就需要解決上述問題:貪心
#include<string>
#include<iostream>
#include<fstream>
#include <map>
#include <queue>
//#include <deque>
using namespace std;

ifstream fin("jobs.txt");

struct Job{
	int w;
	int l;

	bool operator < (const Job & n)const {

		if( (w - l) == (n.w - n.l) ) return w > n.w;
		return (w - l) > (n.w - n.l);

		//return (w *1.0/ l) > (n.w *1.0/ n.l);

	}
};

const int N = 10000 + 10;
struct Job data[N];
int  input()
{
	int n;
	fin >>n ;

	for(int i = 1 ; i <= n ; i ++){
		fin>>data[i].w >>data[i].l;
	}
	return n;

}
void jobs1()
{
	int n = input();
	sort(data+ 1 ,data + n + 1);
	long long sum = 0;
	int l  = 0;
	for(int i = 1 ; i <= n ; i ++){
		l += data[i].l ;
		sum += l * data[i].w;
	}

	cout << sum << endl;
}
2: 最小生成樹 證明: 引入割的定義: G=<V,E> ,V是G的頂點集,那麼割是對(S,V-S)的一個劃分,當一條邊e(u,v),其中一個端點屬於S,另一個屬於V-S。那麼這條邊是割的邊。 cut 對於最小生成樹的幫助是,如果某條邊是cut(S,V-S)中最小的,那麼這條邊一定是屬於最小生成樹裡面的。 如果某割是兩個子圖之間權值最小的邊,那麼他一定在最小生成樹裡面。
for(int i = 1 ; i < n ; i ++){
	int mindist = 0x33fffff;
	// get min
	for(int j = 1 ; j <= n ; j ++){
		if(used[j] == 0){
			if(dist[j] < mindist){
				mindist = dist[j];
				pos = j;
			}
		}
	}//end for
	ans  += mindist;
	used[pos] = 1;

	for(int j = 1 ; j <= n ; j ++){
		if(used[j] == 0){
			if(dist[j] >  mat[pos][j])
				dist[j] =  mat[pos][j];
		}
	}
}
原始部落格地址

相關推薦

任務排程小生成樹

排程問題: 問題背景:一個共享資源,多個job要訪問。 question:那我們應該如何排列job的順序 假定:每個job 有優先順序 ,和需要使用資源的時間長度當我們排列所有job之後,每個job都會有一個開始時間和結束時間,那麼如何評定一個方案是不是好方案 ,/

大生成樹poj2377 (小生成樹一個原理,只是排序的時候要降序排列)

#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1000+10; const int maxm=20000+10; struc

圖的生成樹小生成樹

一、生成樹的概念                 在一個任意連通圖G中,如果取它的全部頂點和一部分邊構成一個子圖G',即:V(G')=V(G)和E

圖論經典演算法(通俗易懂):短路徑小生成樹

一、最短路問題 求圖的最短路問題,幾乎是圖論的必學內容,而且在演算法分析與設計中也會涉及。很多書上內容, 實在沒法看,我們的圖論教材,更是編的非常糟糕,吐槽,為啥要用自己學校編的破教材,不過據說 下一屆終於要換書了。 言歸正傳,開始說明最短路問題。

圖--生成樹小生成樹

樹(自由樹)、無序樹和有根樹      自由樹就是一個無迴路的連通圖(沒有確定根)(在自由樹中選定一頂點做根,則成為一棵通常的樹)。      從根開始,為每個頂點(在樹中通常稱作結點)的孩子規定從左到右的次序,則它就成為一棵有序樹。      在圖的應用中,我們常常需要求

幾分鐘搞明白生成樹小生成樹的定義

注意文字意思:不管是生成樹還是最小生成樹一定還是輸,千萬別和圖混淆了。 下面來說生成樹:我們這棵樹是針對圖來說的,如果你們已經知道極小連通子圖就非常簡單了, 極小連通子圖什麼意思呢,就是我們把圖中的全部節點連線起來,假如n個節點那麼,邊是n - 1條。 注

比較Dijkstra演算法小生成樹prim演算法之間的區別

我們先看看他們的模板: Dijkstra演算法: #include<iostream> #include<string.h> using namespace std; const int MAX=99999999; int n,m; int map

小生成樹(Prim算法Kruskal算法)

under net 任務 合並 一個 心算 std fin details 1)最小生成樹 給定一個無向圖,如果它的某個子圖中任意兩個頂點都互相連通並且是一棵樹,那麽這棵樹就叫生成樹。如果邊上有權值,那麽使得邊權和最小的生成樹叫做最小生成樹(MST,Minimum Span

小生成樹-Prim算法Kruskal算法

圖論 img height 高亮 lin 開始 a算法 能夠 步驟 Prim算法 1.概覽 普裏姆算法 (Prim 算法),圖論中的一種算法,可在加權連通圖裏搜索最小生成樹。意即由此算法搜索到的邊子集所構成的樹中,不但包括了連通圖裏的所有頂點 (英語 : Vertex

小生成樹算法(克魯斯卡爾算法普裏姆算法)

algo 貪心 size cin out visit cast 聯通 兩個 一般最小生成樹算法分成兩種算法: 一個是克魯斯卡爾算法:這個算法的思想是利用貪心的思想,對每條邊的權值先排個序,然後每次選取當前最小的邊,判斷一下這條邊的點是否已經被選過了,也就是已經在樹內了,一般

小生成樹Prim算法Kruskal算法

img 使用 .html 註意 包括 cnblogs 生成 針對 矩陣 Prim算法(使用visited數組實現) Prim算法求最小生成樹的時候和邊數無關,和頂點樹有關,所以適合求解稠密網的最小生成樹。 Prim算法的步驟包括: 1. 將一個圖分為兩部分,一部分歸為點集U

小生成樹的兩種方法(Kruskal演算法Prim演算法)

關於圖的幾個概念定義: 連通圖:在無向圖中,若任意兩個頂點vivi與vjvj都有路徑相通,則稱該無向圖為連通圖。 強連通圖:在有向圖中,若任意兩個頂點vivi與vjvj都有路徑相通,則稱該有向圖為強連通圖。 連通網:在連通圖中,若圖的邊具有一定的意義,每一條邊都對應著一個數,稱

小生成樹的prim演算法kruskal演算法

轉載自:勿在浮沙築高臺http://blog.csdn.net/luoshixian099/article/details/51908175 關於圖的幾個概念定義: 連通圖:在無向圖中,若任意兩個頂點vi與vj都有路徑相通,則稱該無向圖為連通圖。 強連通圖:在有向圖中,若任意兩個

小生成樹演算法:普里姆演算法克魯斯卡爾演算法

普里姆演算法—Prim演算法 演算法思路:  從已選頂點所關聯的未選邊中找出權重最小的邊,並且生成樹不存在環。 其中,已選頂點是構成最小生成樹的結點,未選邊是不屬於生成樹中的邊。 (普里姆演算法與求最短路徑的迪傑斯塔拉演算法思想很類似)   下面我們對下面這幅

(Java資料結構演算法)小生成樹---Kruskal演算法(並查集)

該文章利用prime演算法求得連通圖的最小生成樹對應的邊權最小和,prime演算法是從頂點的角度思考和解決問題。本文介紹的Kruskal演算法將從邊的角度考慮並解決問題,利用了並查集方便地解決了最小生成樹的問題。 本文參考博文 //並查集 class UnionSameSet{

(Java資料結構演算法)小生成樹---prime演算法

參考博文 public class Main { public static void main(String[] args){ int inf = 1000000;//無窮大 //圖,可以這樣認為:圖的任意兩個頂點之間都有邊,兩頂點無法到達的,可以認為他們之間的邊權是

小生成樹演算法普利姆演算法克魯斯卡爾演算法實現

最小生成樹演算法: 普里姆演算法:頂點集合N,輔助頂點集合S,初始化中,將出發點vi加入S,並從N中刪除 1.從頂點集合N中找到一條到集合S最近的邊(vi,vj),儲存該邊,並將vj從N移到S中 2.重複1步驟直至所有頂點加入S集合 普里姆演算法:與邊的多少關係不大,適合計算邊稠密的圖

Project-2: Prim Kruskal 演算法尋找小生成樹

Prim 和 Kruskal 演算法尋找最小生成樹 實驗原理 堆 堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於(或不小於)其左子節點和右子節點的值。最大堆和最小堆是二叉堆的兩種形式。最大堆:根結點的鍵值是所有堆結點鍵值中最大者。最小堆:

資料結構--C語言--圖的深度優先遍歷,廣度優先遍歷,拓撲排序,用prime演算法實現小生成樹,用迪傑斯特拉演算法實現關鍵路徑關鍵活動的求解,短路徑

實驗七  圖的深度優先遍歷(選做,驗證性實驗,4學時) 實驗目的 熟悉圖的陣列表示法和鄰接表儲存結構,掌握構造有向圖、無向圖的演算法 ,在掌握以上知識的基礎上,熟悉圖的深度優先遍歷演算法,並實現。 實驗內容 (1)圖的陣列表示法定義及

小生成樹模板(kruskalprim)

不知道是kruskal和prim哪個快,HDU上的prim還是比較快。 上模板: 這個是prim的 #include <bits/stdc++.h> using namespace std; const int maxn = 1e5+7; int vis[m