Description
给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上?
Input
第一行包含用空格隔开的两个整数,分别为N和M;
接下来M行,每行包含三个正整数u,v和w表示图G存在一条边权为w的边(u,v)。
最后一行包含用空格隔开的三个整数,分别为u,v,和 L;
数据保证图中没有自环。
Output
输出一行一个整数表示最少需要删掉的边的数量。
Sample Input
3 2
3 2 1
1 2 3
1 2 2
Sample Output
1
HINT
对于20%的数据满足N ≤ 10,M ≤ 20,L ≤ 20;
对于50%的数据满足N ≤ 300,M ≤ 3000,L ≤ 200;
对于100%的数据满足N ≤ 20000,M ≤ 200000,L ≤ 20000。
题目分析
此题弱化版传送门边权为1,求解两遍累加答案
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 23333
#define M 233333
using namespace std;
struct Node
{
int x,y,z;
}e[M];
inline bool cmp(Node a,Node b)
{
return a.z<b.z;
}
int n,m,s,t,v;
int head[N],to[M<<2],next[M<<2],f[M<<2],tot=1;
inline void add(int x,int y)
{
to[++tot]=y;f[tot]=1;next[tot]=head[x];head[x]=tot;
to[++tot]=x;f[tot]=1;next[tot]=head[y];head[y]=tot;
}
inline void read(int &x)
{
x=0;char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+c-'0',c=getchar();
}
int ans;
queue<int>q;
int dis[N];
bool bfs()
{
memset(dis,-1,sizeof dis);
while(!q.empty())q.pop();
q.push(s);dis[s]=0;
int x;
while(!q.empty())
{
x=q.front();q.pop();
for(int i=head[x];i;i=next[i])if(dis[to[i]]==-1&&f[i])
{
dis[to[i]]=dis[x]+1;
if(to[i]==t)return 1;
q.push(to[i]);
}
}
return 0;
}
int dinic(int x,int flow)
{
if(x==t)return flow;
int temp=flow,a;
for(int i=head[x];i;i=next[i])if(dis[to[i]]==dis[x]+1&&f[i])
{
a=dinic(to[i],min(temp,f[i]));
if(!a)dis[to[i]]=-1;
temp-=a;
f[i]-=a;f[i^1]+=a;
if(!temp)break;
}
return flow-temp;
}
int maxflow()
{
int re=0;
while(bfs())re+=dinic(s,999999999);
return re;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
read(e[i].x),read(e[i].y),read(e[i].z);
}
scanf("%d%d%d",&s,&t,&v);
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(e[i].z>=v)break;
add(e[i].x,e[i].y);
}
ans+=maxflow();
memset(head,0,sizeof head);
memset(next,0,sizeof next);
tot=1;
for(int i=m;i>=1;i--)
{
if(e[i].z<=v)break;
add(e[i].x,e[i].y);
}
ans+=maxflow();
cout<<ans;
return 0;
}