學習筆記 最小費用流之原始對偶

2021-08-27 20:23:21 字數 1217 閱讀 6699

兼具zkw和spfa的優點,折中的一種演算法,通過spfa跑出最短路,然後更改邊的權值(加上dis【from】-dis【to】),那麼如果為0就是在from到to最短路上的點,相當於一種分層(個人理解),就可以用多路增廣來搞了。而這裡的spfa除了第一次外甚至可以拿dij來替換,不過因為加了slf優化的spfa已經還不錯了就沒去寫。(ps:網上大多spfa都要從匯點跑到源點,個人覺得從源到匯也沒什麼區別a,有知道的大佬能來解釋下嗎。。)

**:(分配工作)

#pragma gcc optimize(3,"inline","ofast")

#includeusing namespace std;

const int n=1010,m=250010;

const int s=0,t=1005;

void read(int &x)

int n,m,k,hd[n],nxt[m*3],to[m*3],cost[m*3],las[m*3],tot=-1,mp[510][510];

int cur[n],dis[n],q[m],d=0,ans=0;

bool vis[n],inq[n];

void add(int u,int v,int w,int c)

bool spfa()

inq[to[i]]=1;}}

inq[nw]=0;

}for(int i=0;i<=t;i++)

for(int j=hd[i];j!=-1;j=nxt[j])

cost[j]-=dis[to[j]]-dis[i];

d+=dis[t];

return dis[t]<=2e9;

}int dfs(int pos,int flow)

}return flow-l;

}void mcmf()

while(dfs(s,2e9));

}printf("%d",-ans);

}int main()

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

add(s,i,1,0);

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

add(i+m,t,1,0);

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

for(int j=1;j<=n;j++)

if(mp[i][j]<=2e9)add(i,j+m,1,mp[i][j]);

mcmf();

}

原始對偶費用流

用 dijkstra 代替 spfa link,但是這篇部落格的 上來就跑 dijkstra 複雜度可能會被卡成指數。text interval graph text 滿足題意的充要條件 每個點至多被兩個區間覆蓋。i rightarrow i 1 連一條流量為 2 費用為 0 的邊。l righta...

最小費用流

include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...

最小費用流

int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...