最小割边
思路:将1到n的所有最短路都切断,求最小代价。先跑一遍迪杰斯特拉,然后再在最短路径上重新建图,就变成了在新图上将1到n的所有路径全部切断的最小代价,也就是最小割(边)。根据最大流最小割定理:最大流等于最小割,所以求最大流即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200500;
const ll inf=0x3f3f3f3f3f3f3f3f;
#define fi first
#define se second
typedef pair<ll,int> pli;
int t,n,m,a[N],b[N],c[N],h[N],e[N],ne[N],w[N],idx;
void add(int a,int b,int c)
{
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
ll dist[N];
int cur[N];
bool st[N];
void dij()
{
memset(dist,0x3f,sizeof dist);
memset(st,0,sizeof st);
dist[1]=0;
priority_queue<pli,vector<pli>,greater<pli> >q;
q.push({
0,1});
while(q.size())
{
int u=q.top().se;
q.pop();
if(st[u]) continue;
st[u]=1;
for(int i=h[u];i!=-1;i=ne[i])
{
int v=e[i];
if(dist[v]>dist[u]+w[i])
{
di