BZOJ 1930 吃豆豆 費用流

2022-05-26 23:45:14 字數 2330 閱讀 7622

首先這題的兩條線不相交的限制可以去掉,因為如果相交的話把點換一換是不影響最終結果的。

剩下的費用流建圖是顯然的,把點拆為兩個,建立超級源點s和源點ss匯點t,連邊(s,ss,2,0). 對於每個點,連邊(ss,i,1,0), (i,i',1,1),(i',t,1,0).

這樣跑一遍費用流就行了,然而此題的邊數可以達到n^2.無疑是ole的。需要優化。

容易發現,對於點(i,j),(j,k),(i,k).如果這些點都可以互相到達的話,那麼(i,k)這條邊是不必要的。因為通過j到達k是不會比結果劣的。

所以啟發我們將點按x座標以第一關鍵字排序,y第二關鍵字排序。對於相同的列,選擇大於前一列的y座標且最小的點連邊。

這樣建邊之後還存在乙個問題,可能有個點兩個吃豆人都需要經過,於是再建邊(i,i',1,0),(i',j,2,0).

# include # include 

# include

# include

# include

# include

# include

# include

# include

# include

# include

using

namespace

std;

# define lowbit(x) ((x)&(-x))

# define pi

3.1415926535

# define eps 1e-9

# define mod

1000000007

# define inf

1000000000

# define mem(a,b) memset(a,b,

sizeof

(a))

# define for(i,a,n)

for(int i=a; i<=n; ++i)

# define fo(i,a,n)

for(int i=a; ii)

# define bug puts("h

");# define lch p

<<1

,l,mid

# define rch p

<<1|1,mid+1

,r# define mp make_pair

# define pb push_back

typedef pair

pii;

typedef vector

vi;# pragma comment(linker,

"/stack:1024000000,1024000000")

typedef

long

long

ll;int

scan()

void out(int

a)

if(a>=10) out(a/10

); putchar(a%10+'0'

);}const

int n=4005;//

code begin...

struct nodenode[2005

];struct edgeedge[1000005

];int

head[n], tol, pre[n], dis[n], nn;

bool

vis[n];

queue

q;void init(int n)

void addedge(int u, int v, int cap, int

cost)

bool spfa(int s, int

t) }

}if (pre[t]==-1) return

false

;

else

return

true;}

int mincostmaxflow(int s, int t, int &cost)

for (int i=pre[t]; i!=-1; i=pre[edge[i^1

].to])

flow+=min;

}return

flow;

}bool

comp(node a, node b)

intmain ()

sort(node+1,node+n+1

,comp);

for(i,

1,n)

}intans;

mincostmaxflow(s,t,ans);

printf(

"%d\n

",-ans);

return0;

}

view code

bzoj1834(網路流 費用流)

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。第一問裸的網路流 第二問 新建乙個匯點,將n號點與匯點相連,容量為k,限制最多增大的流量 費用為0 將原先每一條邊都新...

BZOJ 3442 學習小組 費用流

題目大意 給出學生的數目和學習小組的數目,學生參加小組需要交納費用,每個小組會支出c i cnt i 2。每個學生可以參加k個小組,問最多的學生參加時,最小支出費用。思路 如果不算後面那個什麼鬼的條件的話,見圖十分顯然。s 每個學生 f k,c 0 每個學生 每個學習小組 f 1,c f i 每個學...

BZOJ 2696 航班安排 費用流

題目大意 k架飛機,n個機場,以0.n 1編號,其中0號為基地機場,每天0時刻起飛機從該機場起飛,並不晚於t時刻回到該機場。m個包機請求,每個請求為在s時刻從a機場起飛,在恰好t時刻到達b機場,可以淨獲利c。機場之間來往有花費。求最大收益。將每乙個請求拆成兩個點,在兩個點之間連一條費用為負的完成請求...