bzoj2521: [Shoi2010]最小生成树 最小割

把所有边都减一不就是把次边加一。。。。

对答案有影响的边肯定是比指定边要小的边。

所以我们要阻止制定边的两端点提前连起来。

而最小代价就应该是指定边的代价+1-路径上最大边的值。

然后就形成了一个路径分配问题。所以我们按 指定边的代价+1-边的权值 连边

所的的答案就是最小割

#include 
#include 
#include 
#include 
#include 
using namespace std;
#define maxn 844444
#define INF 1000000000
inline int getint()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n,m,d;
int st,ed,en;
int first[maxn],dis[maxn],q[maxn];
struct node
{
    int v,c,next;
}e[maxn];
int add(int a,int b,int c)
{
    en++;
    e[en].v=b;
    e[en].c=c;
    e[en].next=first[a];
    first[a]=en;
 
    en++;
    e[en].v=a;
    e[en].c=0;
    e[en].next=first[b];
    first[b]=en;
}
struct node2
{
    int x,y,v,id;
}a[maxn];
bool cmp(node2 aa,node2 bb)
{
    return aa.va[d].v) break;
        add(a[i].x,a[i].y,a[d].v+1-a[i].v);
        add(a[i].y,a[i].x,a[d].v+1-a[i].v);
    }
    printf("%d",dinic());
    return 0;
}


你可能感兴趣的:(网络流)