2019杭电暑期多校第一场 E:Path(最短路+最小割)

【题目】

Path

【题解】

题意:给定一个有向图,删掉一些边,边权作为代价,使得最短路长度增加,输出最小总代价。

思路:先用Dijkstra算法求最短路,两个反向图跑出所有满足d(1,u)+w(u,v)+d(v,n)=d(1,n)的边并建图,d(a,b)为从a到b的最短路,再用Dinic算法在新图上求1和n的最小割。

【代码】

#include 
using namespace std;
#define ll long long
#define P pair
const int maxn=1e4+50;
const ll inf=0x3f3f3f3f3f3f3f3f;
struct node{
	int u,v,nxt;
	ll f;
}e[maxn*10];
int n,m,cnt=0;
int head[maxn];
int st,ed,ex;
vector 

g1[maxn],g2[maxn]; ll dis1[maxn],disn[maxn]; priority_queue < P,vector

,greater

> Q; int cur[maxn],dep[maxn]; int q[maxn*2]; int tot,tail; void add(int u,int v,ll f) { e[cnt].u=u; e[cnt].v=v; e[cnt].f=f; e[cnt].nxt=head[u]; head[u]=cnt++; e[cnt].u=v; e[cnt].v=u; e[cnt].f=0; e[cnt].nxt=head[v]; head[v]=cnt++; } void dij(int S,ll *dis,vector

*g) { for(int i=0;i<=n;i++) dis[i]=inf; dis[S]=0; while(Q.size()) Q.pop(); Q.push(P(dis[S],S)); while(Q.size()){ P temp=Q.top(); Q.pop(); int u=temp.second; if(dis[u]

 

 

你可能感兴趣的:(2019杭电暑期多校第一场 E:Path(最短路+最小割))