题意:给定一个无向图,删除某些边有一定的代价,要求删掉使得最短路径减小,求最小代价。
分析:首先要spfa求出起点到各个点的最短距离。对于一条权值为w,起点为i,终点为j的边,设dis[k]为起点到k点的距离,若dis[j]=dis[i]+w,则将该边加入另一个图里,边的容量为删除这条边的代价,则从起点到终点的最大流即为答案。。
1、首先最短路径一定在最短路图上
2、如果起点和终点不联通,就不存在这样一条最短路径,所以最短路径一定会变大;
注意看范围。。wa17发
#include#include #include #include #include using namespace std;typedef long long ll;const ll INF=1e18;const int M=1e4+4;struct node{ ll u,v,nextt; ll w;}g[M<<2],e[M<<2];ll s,t,tot1,tot2,cur[M],head1[M],head2[M],vis[M],deep[M];ll dis[M];void addedge1(ll u,ll v,ll w){ g[tot1].u=u; g[tot1].v=v; g[tot1].w=w; g[tot1].nextt=head1[u]; head1[u]=tot1++;}void addedge2(ll u,ll v,ll w){ e[tot2].v=v; e[tot2].w=w; e[tot2].nextt=head2[u]; head2[u]=tot2++; e[tot2].v=u; e[tot2].w=0; e[tot2].nextt=head2[v]; head2[v]=tot2++; }void dij(){ for(int i=0;i<=t;i++) dis[i]=INF;// cout<<"!!"<