bzoj 4464 : [Jsoi2013]旅行时的困惑

网络流建图。

从S向每个点连边,从每个点向T连边。

每条树边反向连一条下界为1,上界inf的边。

跑最小流。

注意加当前弧优化。

#include<cstdio>
#include<algorithm>
#define inf 0x3f3f3f3f
#define N 500005
#define M 5000005
using namespace std;
int head[N],ver[M],nxt[M],f[M],tot,ch[N],cur[M];
void add(int a,int b,int c)
{
    tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;f[tot]=c;
    tot++;nxt[tot]=head[b];head[b]=tot;ver[tot]=a;f[tot]=0;
    return ;
}
int S,T,tim;
int vis[100005],q[M];
bool tell()
{
    tim++;
    int l=1,r=1;q[1]=S;
    ch[S]=0;vis[S]=tim;
    while(l<=r)
    {
        int tmp=q[l++];
        for(int i=head[tmp];i;i=nxt[i])
        {
            if(f[i]&&vis[ver[i]]!=tim)
            {
                ch[ver[i]]=ch[tmp]+1;
                vis[ver[i]]=tim;
                q[++r]=ver[i];
            }
        }
    }
    return vis[T]==tim;
}
int zeng(int a,int b)
{
    if(a==T)return b;
    int r=0;
    for(int i=cur[a];i&&b>r;i=nxt[i])
    {
        if(ch[ver[i]]==ch[a]+1&&f[i])
        {
            int t=zeng(ver[i],min(b-r,f[i]));
            r+=t;f[i]-=t;f[i^1]+=t;
            if(f[i]>0)cur[a]=i;
        }
    }
    if(!r)ch[a]=-1;
    return r;
}
int dinic()
{
    int r=0,t;
    while(tell())
    {
        for(int i=0;i<=T;i++)cur[i]=head[i];
        while(t=zeng(S,inf))r+=t;
    }
    return r;
}
int n;
int ru[N],chu[N];
int main()
{
    scanf("%d",&n);int t1,t2;
    tot=1;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&t1,&t2);
        t1++;t2++;
        ru[t2]++;chu[t1]++;
        add(t1,t2,inf);
    }
    int TT=n+1,SS=0;
    for(int i=1;i<=n;i++)
    {
        add(SS,i,inf);add(i,TT,inf);
    }
    S=n+2;T=n+3;
    for(int i=1;i<=n;i++)
    {
        if(chu[i]>ru[i])
        {
            add(i,T,chu[i]-ru[i]);
        }
        else if(ru[i]>chu[i])
        {
            add(S,i,ru[i]-chu[i]);
        }
    }
    dinic();
    add(TT,SS,inf);
    dinic();
    printf("%d\n",f[tot]);
    return 0;
}

  

时间: 2024-10-30 10:21:59

bzoj 4464 : [Jsoi2013]旅行时的困惑的相关文章

bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][Discuss] Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们用不同的正整数代表 各种宗教,  S国的居民常常旅行.旅行时他们总

[BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)

Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们用不同的正整数代表各种宗教,  S国的居民常常旅行.旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿.当然旅程的终点也是信仰与他相同的城市.S国政府为每个城市标定了不同的旅行评级,旅行者们常会记下途中(包括起点和终点)留宿过的城市的评级总和或最大值. 在S国的历史

[BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】

题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于“郁闷的小 J ” 那道题目.将各种操作和询问按照颜色为第一关键字,时间为第二关键字排序. 那么修改颜色的操作就相当于在原颜色中是删点,在新颜色中是加点. 处理完一种颜色的操作后,要将这个颜色的点都做一次删除操作,这样,对于处理下一种颜色,树就又是空的了. 这种题,思考的时候有点晕,写代码的时候非常

BZOJ 3091: 城市旅行 [LCT splay 期望]

3091: 城市旅行 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1454  Solved: 483[Submit][Status][Discuss] Description Input Output Sample Input 4 5 1 3 2 5 1 2 1 3 2 4 4 2 4 1 2 4 2 3 4 3 1 4 1 4 1 4 Sample Output 16/3 6/1 HINT 对于所有数据满足 1<=N<=50,000 1&l

【BZOJ 2746】旅行问题

Description yz是Z国的领导人,他规定每个地区的名字只能为26个小写拉丁字母的一个.由于地 区数有可能超过26个,便产生了一个问题,如何辨别名字相同的地区?于是yz规定,一个 地区的描述必须包含它的所有上级,且上级按次序排列.于是,一个地区的描述是一个字符 串.比如说,一个地区的名字为c,它的上级为b,b的上级为a,a没有上级,那么这个地 区就描述为abc.显然,这个描述同时包含了c的上级b和b的上级a的描述,分别为ab和a. 值得注意的是,每个地区最多有一个上级,同一上级的地区之间

BZOJ 3091 城市旅行 Link-Cut-Tree

警告:此题不可以使用cout进行输出,只能用printf,否则RE!亲测!! 题目大意:给定一棵树,每个点有一个点权,提供四种操作: 1.删除两点之间的连边 不存在边则无视 2.在两点之前连接一条边 两点已经联通则无视 3.在两点之间的路径上所有点的点权加上一个数 两点不连通则无视 4.询问两点之间路径上任选两点路径上的点权和的期望值 前三个操作都很基础 但是第四个东西--这啥玩应这是-- 首先这个期望值等于路径上所有无序点对路径上权值和的平均值 还是很抽象?没关系,拿样例说话 样例第一个询问

bzoj 1050: [HAOI2006]旅行comf(最小生成树+并查集)

1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2405  Solved: 1282 [Submit][Status][Discuss] Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T ,求一条路径,使得路径上最大边和最小边的比值最小.如果S和T之间没有路径,输出"IMPOSS

BZOJ 1050 HAOI2006 旅行comf 动点SPFA

题目大意:给定一个无向图,每条边上有权值,求起点到终点的路径中最长边和最短边的最小比值 随手点开一道居然是动点SPFA的裸题-- 魔法森林都切了这个问题就不大了 我们把边权排序,从大到小加进这个图中,每加进一条边就把边的两个端点加进队列,直接跑SPFA,维护起点到每个点路径上的最长边的最小值,然后用当前边权作为分母更新ans 这样可以保证每次跑出来的都是当前边为最短边时起点到终点的最长边的最小值,同时由于我们保留了上一次的信息而不至于超时 好强大的算法--可惜搞不出来时间复杂度0.0 #incl

【bzoj题解】2186 莎拉公主的困惑

题目传送门. 题意:求\([1,n!]\)中与\(m!\)互质的数的个数,对质数\(R\)取模,\(n\geq m\). 答案应该等于\(\frac{n!}{m!}\phi(m!)=\frac{n!}{m!}m!\prod_{p|m!}\frac{p-1}{p}=n!\frac{\prod_{p\leq m}\,p-1}{\prod_{p\leq m}\,p}\). 这里\(p\)为小于等于\(m\)的质数. 所以我们处理出阶乘,以及质数的乘积和对\(R\)的逆元就能得出答案. 你真的这么想?