時空限制1000ms / 128mb
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e=,和進行這些實驗需要使用的全部儀器的集合i=。實驗ej需要用到的儀器是i的子集rjíi。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。
對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。
輸入格式:
第1行有2 個正整數m和n。m是實驗數,n是儀器數。接下來的m 行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的n個數是配置每個儀器的費用。
輸出格式:
第1 行是實驗編號;第2行是儀器編號;最後一行是淨收益。
輸入樣例:
2 3輸出樣例:10 1 2
25 2 3
5 6 7
1 2感謝@flierking 提供spj1 2 3
17
n,m<=50
這道題資料是在windows生成的,輸入資料中所有的換行都是'\r\n'而不是'\n'
讀入某實驗需要用到的儀器編號的時候,可以這麼讀入。(感謝@zhouyonglong的提供)
char tools[10000];
memset(tools,0,sizeof tools);
cin.getline(tools,10000);
int ulen=0,tool;
while (sscanf(tools+ulen,"%d",&tool)==1)//之前已經用scanf讀完了贊助商同意支付該實驗的費用
}ulen++;
}
最大權閉合子圖。題目的輸出實驗和儀器序號是個麻煩點。
我的幾點思考:
1.最大權閉合子圖的問題可以轉化為求解最小割的問題,我們所求的閉合子圖是最小割產生的兩個子圖中,與源點連線的那個子圖。
2.不針對本題,若是要輸出最小割,網上有一種解法,就是在最後dinic演算法結束的殘留網路中,從源點尋找與源點仍然連線的點,並打上標記,這樣若某一條邊的兩個端點,乙個帶標記,乙個不帶標記,則這條邊可以作為最小割的邊刪去。我個人理解這樣刪去的邊應該是第一階段滿流的那幾條邊。這樣刪除的邊最後肯定是滿足最小割的,但是邊數可能不是最少的。若要求最少邊數,則需要跑兩遍dinic(第一遍跑最大流,第二遍把第一遍中滿流的邊權設為1,其他為inf,再跑一邊最小割)。
3.最大權閉合子圖的題目很特殊,它的最小割的邊都是與源點或者匯點直接相連,如果答案的方法是唯一的話,那麼最小割應該也是唯一的(個人猜測),這樣的話在dinic之後從源點開始遍歷與源點仍然連線的點,這些點都是最大權閉合子圖中的點。
#include#define n 155view code#define inf llong_max/2
using
namespace
std;
typedef
struct
ss;ss edg[n*n];
int now_edges=0
;vector
edges[n];
void addedge(int u,int v,long
long
flow)
; edges[v].push_back(now_edges);
edg[now_edges++]=(ss)
;}int
dis[n],s,t;
bool
bfs()}}
if(dis[t]==0)return0;
return1;
}int
current[n];
long
long dfs(int now,long
long
maxflow)}}
return0;
}long
long
dinic()
return
ans;
}vector
experiment[n];
intmain()
}ulen++;}}
for(int i=1;i<=n;i++)
tot-=dinic();
for(int i=1;i<=m;i++)
}if(t)printf("
%d "
,i);
}printf("\n
");for(int i=1;i<=n;i++)
if(dis[i])printf("
%d "
,i);
printf("\n
");printf(
"%lld\n
",tot);
return0;
}
網路流24題 太空飛行計畫問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 最大權閉合子圖裸題,先將所有收益加起來,源點向每個方案連線一條收益的流,每個方案向對應需要的儀器連一條inf,每個儀器向匯點連一條花費的流。輸出方案只需要在最後的阻塞流中看還剩哪幾個點...
網路流24題 太空飛行計畫問題
已確定了乙個可供選擇的實驗集合e 和實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最...
太空飛行計畫問題 網路流24題
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的...