兼具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...