zoukankan      html  css  js  c++  java
  • bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流

    3931: [CQOI2015]网络吞吐量

    Time Limit: 10 Sec  Memory Limit: 512 MB

    Description

     路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点。网络中实现路由转发的硬件设备称为路由器。为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包。例如在常用的路由算法OSPF(开放式最短路径优先)中,路由器会使用经典的Dijkstra算法计算最短路径,然后尽量沿最短路径转发数据包。现在,若已知一个计算机网络中各路由器间的连接情况,以及各个路由器的最大吞吐量(即每秒能转发的数据包数量),假设所有数据包一定沿最短路径转发,试计算从路由器1到路由器n的网络的最大吞吐量。计算中忽略转发及传输的时间开销,不考虑链路的带宽限制,即认为数据包可以瞬间通过网络。路由器1到路由器n作为起点和终点,自身的吞吐量不用考虑,网络上也不存在将1和n直接相连的链路。

     

    Input

    输入文件第一行包含两个空格分开的正整数n和m,分别表示路由器数量和链路的数量。网络中的路由器使用1到n编号。接下来m行,每行包含三个空格分开的正整数a、b和d,表示从路由器a到路由器b存在一条距离为d的双向链路。 接下来n行,每行包含一个正整数c,分别给出每一个路由器的吞吐量。

     

    Output

    输出一个整数,为题目所求吞吐量。

     

    Sample Input

    7 10
    1 2 2
    1 5 2
    2 4 1
    2 3 3
    3 7 1
    4 5 4
    4 3 1
    4 6 1
    5 6 2
    6 7 1
    1
    100
    20
    50
    20
    60
    1

    Sample Output

    70

    HINT

     对于100%的数据,n≤500,m≤100000,d,c≤10^9

    Source

    跑完最短路之后重新建边,然后就是裸的网络流

    注意一定要开long long,并且inf一定要大。。。T_T

    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define pa pair<ll,ll>
    #define N 410010
    #define M 510
    inline ll read()
    {
        ll 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;
    }
    const ll inf=(1LL<<60)-1;
    ll cnt,lj[N],fro[N],to[N],v[N];
    inline void add(ll a,ll b,ll c){fro[++cnt]=lj[a];to[cnt]=b;v[cnt]=c;lj[a]=cnt;}
    inline void ins(ll a,ll b,ll c){add(a,b,c);add(b,a,0);}
    ll dis[N],ans;
    bool vs[N];
    void dijsktra()
    {
        priority_queue<pa,vector<pa>,greater<pa> >q;
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        q.push(make_pair(0,1));
        ll u,et;
        while(!q.empty())
        {
            u=q.top().second;q.pop();
            if(vs[u]) continue;
            vs[u]=1;
            for(int i=lj[u];i;i=fro[i])
            {
                et=to[i];
                if(dis[et]>dis[u]+v[i])
                {
                    dis[et]=dis[u]+v[i];
                    q.push(make_pair(dis[et],et));
                }
            }
        }
    }
    ll n,m;
    queue<ll>q;
    bool bfs()
    {
        memset(dis,0,sizeof(dis));
        dis[1]=1;
        q.push(1);
        ll u;
        while(!q.empty())
        {
            u=q.front();q.pop();
            for(int i=lj[u];i;i=fro[i])
            {
                if(v[i]&&!dis[to[i]])
                {
                    dis[to[i]]=dis[u]+1;
                    q.push(to[i]);
                }
            }
        }
        return dis[n]?1:0;
    }
    ll dfs(ll x,ll p)
    {
        if(x==n||p==0) return p;
        ll tmp=0,tp;
        for(int i=lj[x];i;i=fro[i])
        {
            if(v[i]&&dis[to[i]]==dis[x]+1)
            {
                tp=dfs(to[i],min(p-tmp,v[i]));
                v[i]-=tp;
                v[i^1]+=tp;
                tmp+=tp;
                if(p==tmp) return tmp;
            }
        }
        if(tmp==0) dis[x]=1;
        return tmp;
    }
    ll x[N],y[N],d[N],c;
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=m;i++)
        {
            x[i]=read();y[i]=read();d[i]=read();
            add(x[i],y[i],d[i]);add(y[i],x[i],d[i]);
        }
        dijsktra();
        memset(lj,0,sizeof(lj));cnt=1;
        for(int i=1;i<=m;i++)
        {
            if(dis[x[i]]+d[i]==dis[y[i]]) ins(x[i]+n,y[i],inf);
            if(dis[y[i]]+d[i]==dis[x[i]]) ins(y[i]+n,x[i],inf);
        }
        for(int i=1;i<=n;i++){c=read();ins(i,i+n,(i==1)||(i==n)?inf:c);}
        n<<=1;
        while(bfs()) ans+=dfs(1,inf);
        printf("%lld
    ",ans);
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    1-接口测试基础知识
    import os
    好用封装好的函数
    python下载代码
    cookie关系图,url编码(urllib.parse模块)
    import flask(make_response),urllib,requests,base64
    mock接口开发,excel(读,写,修改)
    import json,random,time,datetime,hashlib,redis,pymysql
    集合和函数
    python 文件读写
  • 原文地址:https://www.cnblogs.com/lkhll/p/6646709.html
Copyright © 2011-2022 走看看