bzoj 2502: 清理雪道 最小流

2502: 清理雪道

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 868  Solved: 466
[Submit][Status][Discuss]

Description

滑雪场坐落在FJ省西北部的若干座山上。

从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。

你的团队负责每周定时清理雪道。你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部。从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道。

由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务。

LYD:

类似 <有源汇上下界可行流> 的构图方法,但是不添加T到S的边,求一次超级源到超级汇的最大流。

加边(T,S,0,+∞),在上一步残量网络基础上再求一次超级源到超级汇的最大流。

流经T到S的边的流量就是最小流的值。

该算法的思想是在第一步中尽可能填充循环流,以减小最小流的代价。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define N 155
#define M 400005
using namespace std;
int head[N],ver[M],nxt[M],f[M],tot,ch[N];
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 ;
}
queue<int>q;int S,T;
bool tell()
{
    memset(ch,-1,sizeof(ch));
    q.push(S);ch[S]=0;
    while(!q.empty())
    {
        int tmp=q.front();q.pop();
        for(int i=head[tmp];i;i=nxt[i])
        {
            if(f[i]&&ch[ver[i]]==-1)
            {
                ch[ver[i]]=ch[tmp]+1;
                q.push(ver[i]);
            }
        }
    }
    return ch[T]!=-1;
}
int zeng(int a,int b)
{
    if(a==T)return b;
    int r=0;
    for(int i=head[a];i&&b>r;i=nxt[i])
    {
        if(f[i]&&ch[ver[i]]==ch[a]+1)
        {
            int t=zeng(ver[i],min(f[i],b-r));
            f[i]-=t;f[i^1]+=t;r+=t;
        }
    }
    if(!r)ch[a]=-1;
    return r;
}
int dinic()
{
    int r=0,t;
    while(tell())while(t=zeng(S,inf))r+=t;
    return r;
}
int n;
int ru[N],chu[N];
int main()
{
    scanf("%d",&n);tot=1;
    int SS=n+1,TT=n+2;
    for(int i=1;i<=n;i++)
    {
    	int tmp,t;
    	scanf("%d",&tmp);
		for(int j=1;j<=tmp;j++)
    	{
    		scanf("%d",&t);
    		add(i,t,inf);
    		chu[i]++;ru[t]++;
    	}
    }
    for(int i=1;i<=n;i++)
    {
    	add(SS,i,inf);add(i,TT,inf);
    }
    S=n+3,T=n+4;
    for(int i=1;i<=n;i++)
    {
    	if(chu[i]>ru[i])
    	{
    		add(i,T,chu[i]-ru[i]);
    	}
    	else add(S,i,ru[i]-chu[i]);
    }
    dinic();
    add(TT,SS,inf);
    dinic();
    printf("%d\n",f[tot]);
    return 0;
}

  

时间: 2024-10-12 02:31:44

bzoj 2502: 清理雪道 最小流的相关文章

bzoj 2502 清理雪道 (有源汇上下界最小流)

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费

BZOJ 2502: 清理雪道 | 有上下界最小流

#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #define N 405 #define INF 0x3f3f3f3f #define M 200005 using namespace std; int head[N],cur[N],n,m,S,T,d[N],s,t,sum,ecnt=1,lev[N],ans,dec; queue<int> q; st

[BZOJ2502]清理雪道 有上下界网络流(最小流)

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费

【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 594  Solved: 318[Submit][Status][Discuss] Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出

bzoj2502 清理雪道

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 307  Solved: 150 [Submit][Status][id=2502" style="color:blue; text-decoration:none">Discuss] Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中俯视,滑雪场能够看作一个有向无环图.每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你

【BZOJ】【2502】清理雪道

网络流/上下界网络流 带下界的最小可行流…… 我SB了,跑网络流的时候是得从虚拟源0往出跑……而不是S…… Orz Hzwer 1 /************************************************************** 2 Problem: 2502 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:3080 ms 7 Memory:10652 kb 8 ********************

[BZOJ2502]清理雪道解题报告|带下界的最小流

滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务. 题意就是给定一张DAG,求每条边起码经过一次求覆盖所有边的最小路径条数

BZOJ_2502_清理雪道_有源汇上下界最小流

Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务. Input 输入文件的第一行包含一个整数n (2

BZOJ 1927 星际竞速(最小费用最大流)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1927 题意:一个图,n个点.对于给出的每条边 u,v,w,表示u和v中编号小的那个到编号大的那个的时间为w.另外有n个值Ai,表示从任何一个点到达i点的时间为Ai.初始时你在n个点之外的一个 点上,我们称其为初始点B.要求从B出发,遍历n个点每个点一次,求最小时间.显然开始你只能使用Ai从B到达n个点中的某个点,因为B到n个点中没有其 他的边. 思路:因为最后停在了某个点上,那么从B出