首先這題的兩條線不相交的限制可以去掉,因為如果相交的話把點換一換是不影響最終結果的。
剩下的費用流建圖是顯然的,把點拆為兩個,建立超級源點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 # includeview code# 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;
}
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。機場之間來往有花費。求最大收益。將每乙個請求拆成兩個點,在兩個點之間連一條費用為負的完成請求...