题解:
暂时不想写题QWQ
显然,加入这条边后,权值比它大的边和比它小的边都不能让这两个点连通。求最小割即可。
蒟蒻只会isap。好久没打isap的板子了…又及这范围还真的过得去。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 20005
#define maxm 400005
#define INF 0x3f3f3f3f
using namespace std;
int n,m,s,t,l,d[maxn],vd[maxn],ans;
struct node { int v,cap; node *inv,*nxt; } edge[maxm],*head[maxn],*ncnt;
struct edg { int u,v,w; } a[maxm];
bool cmp(edg p,edg q) { return p.w<q.w; }
void addedge(int u,int v,int cap)
{
ncnt++;
ncnt->v=v,ncnt->cap=cap,ncnt->nxt=head[u];
head[u]=ncnt;
}
void Addedge(int u,int v)
{
addedge(u,v,1); addedge(v,u,1);
ncnt->inv=ncnt-1,(ncnt-1)->inv=ncnt;
}
int aug(int u,int tot)
{
int sum=0,mind=n-1;
if(u==t) return tot;
for(node *p=head[u];p;p=p->nxt)
if(p->cap>0)
{
int v=p->v;
if(d[u]==d[v]+1)
{
int delta=min(tot-sum,p->cap);
delta=aug(v,delta);
p->cap-=delta,p->inv->cap+=delta,sum+=delta;
if(d[s]>=n) return sum;
if(sum==tot) break;
}
mind=min(mind,d[v]);
}
if(!sum)
{
vd[d[u]]--;
if(!vd[d[u]]) d[s]=n;
d[u]=mind+1,vd[d[u]]++;
}
return sum;
}
void sap()
{
memset(d,0,sizeof(d));
memset(vd,0,sizeof(vd));
vd[0]=n;
while(d[s]<n) ans+=aug(s,INF);
}
int main()
{
scanf("%d%d",&n,&m);
ncnt=&edge[0];
for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
sort(a+1,a+m+1,cmp);
scanf("%d%d%d",&s,&t,&l);
for(int i=1;i<=m&&a[i].w<l;i++) Addedge(a[i].u,a[i].v);
sap();
memset(head,0,sizeof(head));
for(int i=m;i&&a[i].w>l;i--) Addedge(a[i].u,a[i].v);
sap();
printf("%d\n",ans);
}