bzoj1834 網路流加費用流

2021-07-10 09:00:46 字數 1819 閱讀 4539

time limit: 3 sec  

memory limit: 64 mb

submit: 2390  

solved: 1206 [

submit][

status][

discuss]

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求: 1、 在不擴容的情況下,1到n的最大流; 2、 將1到n的最大流增加k所需的最小擴容費用。

輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數、邊數以及所需要增加的流量。 接下來的m行每行包含四個整數u,v,c,w,表示一條從u到v,容量為c,擴容費用為w的邊。

輸出檔案一行包含兩個整數,分別表示問題1和問題2的答案。

5 8 2

1 2 5 8

2 5 9 9

5 1 6 2

5 1 1 8

1 2 8 7

2 5 4 9

1 2 1 1

1 4 2 1

13 19

30%的資料中,n<=100

100%的資料中,n<=1000,m<=5000,k<=10

解題思路:第一問就是最大流,然後第二問,可以對在建m條邊,只是產生費用,再來乙個源點,到一的容量為k。跑一邊費用流。

#include

#include

#include

#include

using namespace std;

int n,m,k,len,ans;

int from[21000],to[21000],cc[21000],ww[21000],next[21000];

int h[1100];

int dis[1100];

int q[1000000];

bool og[1100];

int pre[1100];

int x[5100],y[5100],c[5100],w[5100];

inline int read()

while (y>='0' && y<='9')

return x*f;

}void insert(int x,int y,int c,int w)

int dicnic(int sum,int now)

}u=next[u];

}if (sug==0) dis[now]=-1;

return sug;

}bool bfs()

u=next[u];}}

if (dis[n]!=-1) return true; else return false;

}bool spfa()

}u=next[u];

}og[q[head]]=true;

}if (dis[n]<1000000) return true;else return false;

} void mcf()

now=n;

while (now!=0)

} int main()

int sum=0;

while (bfs())

printf("%d ",sum);

insert(0,1,k,0); insert(1,0,-k,0); 

for (int i=1;i<=m;++i)

ans=0;

while (spfa())

printf("%d",ans);

}

bzoj1834(網路流 費用流)

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

bzoj 1834 網路流(最大流 費用流)

題意 n個點,m條無向邊,每條邊有乙個容量和擴容費用 容量擴大1的費用 2個詢問 1 不擴容下的1 n最大流 2 將最大流增加k的最小費用 強行湊出的網路流經典題麼 23333 對於第一問,裸跑最大流即可 第二問的建圖還是很不錯的,一開始認為,應該重新建邊,容量為k,費用是給題目給的。but,too...

bzoj1834 網路擴容 網路流

好久沒寫題解了啊 給你一幅n個點的網路,先求出其1到n的最大流,每條弧還會有個屬性co sti cos ti 表示沒擴容乙個單位的費用,現在我們要求的就是擴容k個單位的最小費用 這是一道比較裸的網路流,第一問直接dinic就是了,重點就在於第二問。我們把第一問的殘量網路繼續利用,其中的每條弧的費用都...