zoukankan      html  css  js  c++  java
  • 洛谷 P2153 [SDOI2009]晨跑

    题目描述

    Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑。 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从 一个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发 跑到学校,保证寝室编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以 在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路 口。Elaxia耐力不太好,他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天 数尽量长。 除了练空手道,Elaxia其他时间都花在了学习和找MM上面,所有他想请你帮忙为他设计 一套满足他要求的晨跑计划。

    存在的边存在。这种情况下,这条边只能走一次。

    输入输出格式

    输入格式:

    第一行:两个数N,M。表示十字路口数和街道数。 接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。

    输出格式:

    两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长 度。

    输入输出样例

    输入样例#1:
    7 10
    1 2 1
    1 3 1
    2 4 1
    3 4 1
    4 5 1
    4 6 1
    2 5 5
    3 6 6
    5 7 1
    6 7 1
    输出样例#1:
    2 11
    

    说明

    对于30%的数据,N ≤ 20,M ≤ 120。

    对于100%的数据,N ≤ 200,M ≤ 20000。

    最小费用最大流

    题目中限制了只能通过一个点一次 

    所以就把一个点拆成入点和出点 ,中间容量为1,费用为0

    1,N 必须通过 所以容量为inf ,费用为0

    然后跑模板 

    天数就是最大流量,路程就是费用

    屠龙宝刀点击就送

    #include <ctype.h>
    #include <cstdio>
    #include <queue>
    #define Max 80000
    #define inf 0x7fffffff
    using namespace std; 
    void read(int &x)
    {
        x=0;bool f=0;
        register char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
        x=f?(~x)+1:x;
    }
    struct Edge
    {
        int next,to,dis,limit;
        Edge (int next=0,int to=0,int limit=0,int dis=0) : next(next),to(to),limit(limit),dis(dis) {}
    }edge[Max<<1];
    bool vis[Max];
    int answer,dist,flow[Max],N,M,head[Max],dis[Max],fa[Max],cnt=1;
    void insert(int u,int v,int w,int l)
    {
        edge[++cnt]=Edge(head[u],v,w,l);
        head[u]=cnt;
    }
    bool spfa(int s,int t)
    {
        for(int i=1;i<=N*N;i++) {dis[i]=inf;flow[i]=inf;vis[i]=0;}
        vis[s]=1;
        dis[s]=fa[s]=0;
        queue<int>Q;
        Q.push(s);
        while(!Q.empty())
        {
            int now=Q.front();
            Q.pop();
            vis[now]=0;
            for(int i=head[now];i;i=edge[i].next)
            {
                int v=edge[i].to;
                if(dis[v]>dis[now]+edge[i].dis&&edge[i].limit>0)
                {
                    dis[v]=dis[now]+edge[i].dis;
                    fa[v]=i;
                    flow[v]=min(flow[now],edge[i].limit);
                    if(!vis[v])
                    {
                        vis[v]=1;
                        Q.push(v); 
                    }
                }
            }
        }
        return dis[t]<inf;
    }
    void dinic(int s,int t)
    {
        for(;spfa(s,t);)
        {
            answer++;
            int x=flow[t];
            for(int i=t;i!=s&&i;i=edge[fa[i]^1].to)
            {
                edge[fa[i]].limit-=x;
                edge[fa[i]^1].limit+=x;
            }
            dist+=x*dis[t];
        }
    }
    int main()
    {
        read(N);
        read(M);
        insert(1,1+N,inf,0);
        insert(1+N,1,0,0);
        insert(N,N+N,inf,0);
        insert(N+N,N,0,0);
        for(int i=2;i<N;i++)
        {
            insert(i,i+N,1,0);
            insert(i+N,i,0,0);
        }
        for(int a,b,c;M--;)
        {
            read(a);
            read(b);
            read(c);
            insert(a+N,b,1,c);
            insert(b,a+N,0,-c);
        }
        dinic(1,N);
        printf("%d %d",answer,dist);
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    Django ORM查询总结
    Django中settings.py 相关配置说明
    项目完整开发流程
    生产环境中不小心升级了glibc该怎么办?
    提取网页里所有链接的方法
    fofa基本语法
    python爬取豆瓣top250电影源码
    一键清理系统的缓存
    内网隧道搭建---Neo-reGeorg
    若依后台管理系统sql注入和未授权访问
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7222637.html
Copyright © 2011-2022 走看看