洛谷 P2762 太空飛行計畫問題

2021-07-28 07:03:14 字數 1762 閱讀 7280

題目背景

題目描述

w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e=,和進行這些實驗需要使用的全部儀器的集合i=。實驗ej需要用到的儀器是i的子集rjíi。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。

對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。

輸入輸出格式

輸入格式:

第1行有2 個正整數m和n。m是實驗數,n是儀器數。接下來的m 行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的n個數是配置每個儀器的費用。

輸出格式:

第1 行是實驗編號;第2行是儀器編號;最後一行是淨收益。

輸入輸出樣例

輸入樣例#1:

2 3

10 1 2

25 2 3

5 6 7

輸出樣例#1:

1 2

1 2 3

17就是成本減最大流,直接上板子

#include

#include

#include

using

namespace

std;

#define inf 1<<30

#define m 100000

#define n 10000

#define cc(m,v) memset(m,v,sizeof(m))

struct node e[m];

int head[n], p, lev[n], cur[n];

int que[m];

void ainit()

bool bfs(int s, int t)

} return

0;

} int dinic(int s, int t)

for (i = cur[u]; cur[u] != -1; i = cur[u] = e[cur[u]].next)

if (e[i].f > 0 && lev[u] + 1 == lev[e[i].v]) break;

if (cur[u] != -1)

que[qin++] = cur[u], u = e[cur[u]].v;

else

} }

return flow;

} void add(int u, int v, int f)

int main()

} for (i = 1; i <= n; i++)

ans = dinic(0, n + m + 1);

for (i = 1; i <= m; i++) if (lev[i] != -1)

printf("%d ", i);

printf("\n");

for (i = m + 1; i <= n + m; i++) if (lev[i] != -1)

printf("%d ", i - m);

printf("\n%d\n",sum - ans);

} return

0;

}

洛谷P2762 太空飛行計畫問題

這題套路好深.沒想渠。題意 給你若干個裝置,若干個任務。每個任務需要若干裝置,裝置可重複利用。完成任務有錢,買裝置要錢。問最大總收益 可以什麼任務都不做 解 最大權閉合子圖。對於乙個有向圖,如果選擇了乙個點,那麼就要選擇它的所有後繼節點。求最大權值和。建立s,t,記所有正權值和為sum。s向所有權值...

P2762 太空飛行計畫問題

本來是想做 noi2009的植物大戰殭屍來著,建了半天模型都沒又成功。於是看了看題解,發現這個問題叫做最大權閉合圖 我tm好像沒學過啊.於是先看了看概念,做了下入門的題目,然後一做就是一晚上 慘 我真不是頹了來著。這個題引入了最大權閉合圖的概念。乙個閉合圖的定義為圖中所有點的出邊的終點都在這個圖中。...

洛谷P2762 太空飛行計畫問題(最小割)

傳送門 總而言之,就是求乙個圖,每乙個點有點權,閉合圖就是若圖中有點 u 且原圖中存在邊 u,v 那麼點 v 也在圖中。然後求乙個最大權的閉合圖即可 具體證明看上面 最大權閉合圖可以轉化成下面那樣建圖之後求最小割 源點向所有實驗連邊,容量為收益,實驗向對應儀器連邊,容量為 inf 儀器向匯點連邊,容...