日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Machine Schedule

發(fā)布時(shí)間:2024/10/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Machine Schedule 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://acm.hdu.edu.cn/showproblem.php?pid=1150

?

題意:有兩臺(tái)機(jī)器A和B以及N個(gè)需要運(yùn)行的任務(wù)。每臺(tái)機(jī)器有M種不同的模式,而每個(gè)任務(wù)都恰好在一臺(tái)機(jī)器上運(yùn)行。如果它在機(jī)器A上運(yùn)行,則機(jī)器A需要設(shè)置為模式xi,如果它在機(jī)器B上運(yùn)行,則機(jī)器A需要設(shè)置為模式y(tǒng)i。每臺(tái)機(jī)器上的任務(wù)可以按照任意順序執(zhí)行,但是每臺(tái)機(jī)器每轉(zhuǎn)換一次模式需要重啟一次。請(qǐng)合理為每個(gè)任務(wù)安排一臺(tái)機(jī)器并合理安排順序,使得機(jī)器重啟次數(shù)盡量少。

C++版本一

題解:

二分圖的最小頂點(diǎn)覆蓋數(shù)=最大匹配數(shù)

本題就是求最小頂點(diǎn)覆蓋數(shù)的。

每個(gè)任務(wù)建立一條邊。

最小點(diǎn)覆蓋就是求最少的點(diǎn)可以連接到所有的邊。本題就是最小點(diǎn)覆蓋=最大二分匹配數(shù)。

注意一點(diǎn)就是:題目說(shuō)初始狀態(tài)為0,所以如果一個(gè)任務(wù)有一點(diǎn)為0的邊不要添加。因?yàn)椴恍枰鷥r(jià)。

/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=1000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans,cnt,flag,temp,sum; bool vis[N]; bool mp[N][N]; int match[N]; char str; struct node{}; bool dfs(int u){for(int i=0;i<m;i++){if(!vis[i]&&mp[u][i]){vis[i]=1;if(match[i]==-1||dfs(match[i])){match[i]=u;return 1;}}}return 0; } int maxmatch(){int res=0;memset(match,-1,sizeof(match));for(int i=0;i<n;i++){memset(vis,0,sizeof(vis));if(dfs(i))res++;}return res; } void init(){memset(mp,0,sizeof(mp));} int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);while(~scanf("%d",&n)&&n){scanf("%d%d",&m,&k);init();for(int i=1;i<=k;i++){scanf("%d%d%d",&t,&u,&v);if(u&&v)mp[u][v]=1;}cout<<maxmatch()<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }

C++版本二

/* HDU 1150 題目大意;有兩臺(tái)機(jī)器A和B以及N個(gè)需要運(yùn)行的任務(wù)。每臺(tái)機(jī)器有M種不同的模式,而每個(gè)任務(wù)都恰好在一臺(tái)機(jī)器上運(yùn)行。如果它在機(jī)器A上運(yùn)行,則機(jī)器A需要設(shè)置為模式xi,如果它在機(jī)器B上運(yùn)行,則機(jī)器A需要設(shè)置為模式y(tǒng)i。每臺(tái)機(jī)器上的任務(wù)可以按照任意順序執(zhí)行,但是每臺(tái)機(jī)器每轉(zhuǎn)換一次模式需要重啟一次。請(qǐng)合理為每個(gè)任務(wù)安排一臺(tái)機(jī)器并合理安排順序,使得機(jī)器重啟次數(shù)盡量少。 二分圖的最小頂點(diǎn)覆蓋數(shù)=最大匹配數(shù)本題就是求最小頂點(diǎn)覆蓋數(shù)的。相當(dāng)于是最小的點(diǎn)消滅掉所有的邊,所以是最小頂點(diǎn)覆蓋*/#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std;/* ************************************************************************** //二分圖匹配(匈牙利算法的DFS實(shí)現(xiàn)) //初始化:g[][]兩邊頂點(diǎn)的劃分情況 //建立g[i][j]表示i->j的有向邊就可以了,是左邊向右邊的匹配 //g沒(méi)有邊相連則初始化為0 //uN是匹配左邊的頂點(diǎn)數(shù),vN是匹配右邊的頂點(diǎn)數(shù) //調(diào)用:res=hungary();輸出最大匹配數(shù) //優(yōu)點(diǎn):適用于稠密圖,DFS找增廣路,實(shí)現(xiàn)簡(jiǎn)潔易于理解 //時(shí)間復(fù)雜度:O(VE) //***************************************************************************/ //頂點(diǎn)編號(hào)從0開(kāi)始的 const int MAXN=110; int uN,vN;//u,v數(shù)目 int g[MAXN][MAXN]; int linker[MAXN]; bool used[MAXN]; bool dfs(int u)//從左邊開(kāi)始找增廣路徑 {int v;for(v=0;v<vN;v++)//這個(gè)頂點(diǎn)編號(hào)從0開(kāi)始,若要從1開(kāi)始需要修改if(g[u][v]&&!used[v]){used[v]=true;if(linker[v]==-1||dfs(linker[v])){//找增廣路,反向linker[v]=u;return true;}}return false;//這個(gè)不要忘了,經(jīng)常忘記這句 } int hungary() {int res=0;int u;memset(linker,-1,sizeof(linker));for(u=0;u<uN;u++){memset(used,0,sizeof(used));if(dfs(u)) res++;}return res; } //******************************************************************************/ int main() {int k;int i,u,v;while(scanf("%d",&uN),uN){scanf("%d%d",&vN,&k);memset(g,0,sizeof(g));while(k--){scanf("%d%d%d",&i,&u,&v);if(u>0&&v>0)g[u][v]=1;//初始狀態(tài)為0,一開(kāi)始0的邊不要加}printf("%d\n",hungary());}return 0; }

?

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Machine Schedule的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。