題目大意:給你n個點的乙個簡單圖(即保證所有從1到n的路徑上的點數都是相等的,且這些路徑沒有交點)
然後有一種操作,給一條邊上的容量減一,另一條邊的容量加一,問最少執行多少次操作使得從1到n的最大流最大。
題解:這個題的關鍵在於讀題,需要注意到這個圖的特點。
首先我們不難想到圖的最大流maxflow = 所有邊的容量sum / 路徑上的邊的個數。
然後我可以隨意出幾個資料,找一下規律。
不難發現規律就是:
對每一條路徑的邊按照容量從小到大排序。
然後依次列舉排序後路徑上的邊,
如果所有路徑上第i小的邊的容量和小於最大流,那麼操作次數就是最大流減去容量和。
否則就直接跳出,因為這時肯定滿足所有路徑上最小邊權值和等於最大流。
舉個例子,假如圖是這樣的:
首先算出最大流就是 (1+2+3+4+5+6) / 3 = 7。
一種比較優的選擇:
先把5->6這條邊的權值挪4個到3->6這條邊,這樣保證最兩個路徑的最小值和為7(即最大流)
然後這樣就保證了這個圖的最大流為7。因為後面的邊也都滿足。
其實這個選擇就是排序後發現,2+1<7,需要在這兩個邊任選乙個邊加4次才能保證最大流 。
因此就轉換成了我們需要考慮每個路徑上對應位置大小的邊的權值和是否大於最大流。
這樣也就能保證取的次數是最少的而且也是最大流。
**實現:
#pragma gcc optimize(2)
#include#include#include#include#include#include#include#include#include#include#include#define pi atan(1.0)*4
#define e 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define rp(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
while(c>='0'&&c<='9')
return a*b;
}const int inf = 0x3f3f3f3f;
const int n = 2e5+7;
struct edgee[n];
int head[n],tot;
vectorg[n];
int cnt;
int n,m;
void addedge(int u,int v,int w)
void dfs(int u,int fa)
}int main()
for(int i=head[1];i;i=e[i].nxt)
flow/=g[1].size();
ll ans=0;
rp(i,0,g[1].size()-1)
printf("%lld",ans);
return 0;
}
CH Position 數列 打表找規律 貪心
總時限10s 記憶體限制 256mb 出題人sliverriver 提交情況 2 7 題目描述 棟棟非常喜歡數列.數列中有n個數且兩兩不同,並且該數列中所有的數都屬於 0,n 那這個數列即為極好數列。對於每兩個極好數列a,b都有契合度,契合度的計算公式如下.契合度 a0 xor b0 a1 xor ...
2019 藍橋杯迷宮 bfs 區域性貪心
觀察資料量,明顯不能用dfs,絕對跑不完。所以採用bfs,根據字典序dlru,所以優先走d l r u,區域性最優,導致的全域性最優,最後優先到達終點的,一定是我們之前選擇的最優解。include include using namespace std int r 50 55 bool book 5...
2019杭電多校 HDU 6695 貪心
題解 分成兩組,其中一組最大的x 另一組最大的y 絕對值最小 題解 按照x從小到大排序,列舉最大x,比x大的都放到另一組,每處理完y記錄一下,然後從前面找到大於x和小於x的最符合的,判斷一下是否可取,然後就是很多x相等的,找乙個y最符合的 include using namespace std ty...