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

Solution

首先要把最短路的网络建出来,如何建网?

跑一边SPFA,对于一条边u->v,如果dis[u]+e[i].dis==dis[v],那么这条路就在最短路网中。

建完网后,因为限制流量于点上而不是边上,所以要拆点为边

(如 ——@——   ->  ——O——a——O——)

连向点a的就连在a左边的点,从a出发的就从a右边的点连出 (可以分别命名为 a,a+n)

从而连接a,a+n的边流量限制为 给定条件,其他边都为INF。

此题请注意值的大小!,务必开long long,inf要开大 (第一遍WA成0分)

Code

 #include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define RG register ll
#define rep(i,a,b) for(RG i=a;i<=b;i++)
#define per(i,a,b) for(RG i=a;i>=b;i--)
#define inf (1ll<<60)
#define maxn 2005
#define maxm 100005
using namespace std;
ll n,m,ct,cnt=,S,T;
ll hd[maxn],head[maxn],step[maxn],dis[maxn],vis[maxn];
struct Edge{
ll u,v,val,next;
}edge[maxm<<];
struct E{
ll v,next,fl;
}e[maxm<<];
inline ll read()
{
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void ad(ll u,ll v,ll val)
{
edge[++ct].u=u,edge[ct].v=v,edge[ct].val=val,edge[ct].next=hd[u],hd[u]=ct,swap(u,v);
edge[++ct].u=u,edge[ct].v=v,edge[ct].val=val,edge[ct].next=hd[u],hd[u]=ct;
} inline void add(ll u,ll v,ll fl)
{
e[++cnt].v=v,e[cnt].fl=fl,e[cnt].next=head[u],head[u]=cnt,swap(u,v);
e[++cnt].v=v,e[cnt].fl= ,e[cnt].next=head[u],head[u]=cnt;
} void SPFA()
{
queue<ll> que;
memset(dis,,sizeof(dis));
dis[]=,que.push();
RG u,v;
while(!que.empty())
{
u=que.front(),que.pop();vis[u]=;
for(RG i=hd[u];i;i=edge[i].next)
{
v=edge[i].v;
if(dis[v]>dis[u]+edge[i].val)
{
dis[v]=dis[u]+edge[i].val;
if(!vis[v]) vis[v]=,que.push(v);
}
}
}
} ll bfs()
{
queue<ll> que;
memset(step,-,sizeof(step));step[S]=,que.push(S);
RG u,v;
while(!que.empty())
{
u=que.front(),que.pop();
for(RG i=head[u];i;i=e[i].next)
{
v=e[i].v;
if(e[i].fl>&&step[v]==-)
step[v]=step[u]+,que.push(v);
}
}
return (step[T]!=-);
} ll dfs(ll u,ll res)
{
if(u==T||!res) return res;
ll rem=res;
for(ll i=head[u];i;i=e[i].next)
{
ll v=e[i].v;
if(step[v]==step[u]+&&e[i].fl>)
{
ll fl=dfs(v,min(rem,e[i].fl));
e[i].fl-=fl,e[i^].fl+=fl;
rem-=fl;
if(!rem) break;
}
}
if(rem) step[u]=-;
return res-rem;
} void Dinic()
{
ll ans=;
while(bfs())
ans+=dfs(S,inf);
printf("%lld",ans);
} int main()
{
n=read(),m=read(),S=,T=(n<<);
RG u,v,val;
rep(i,,m) u=read(),v=read(),val=read(),ad(u,v,val);
SPFA();
rep(i,,ct)
{
u=edge[i].u,v=edge[i].v;
if(dis[u]+edge[i].val==dis[v])
add(u+n,v,inf);
}
read();add(,+n,inf),add(n,n<<,inf);
rep(i,,n-)
val=read(),add(i,i+n,val);
read();
Dinic();
return ;
}

>>点击查看代码<<

网络吞吐量 [CQOI2015] [网络流]的更多相关文章

  1. [CQOI2015]网络吞吐量(网络流+SPFA)

    [CQOI2015]网络吞吐量 题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的 ...

  2. 3931: [CQOI2015]网络吞吐量【网络流】

    网络吞吐量(network)题目描述路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路 ...

  3. bzoj3931: [CQOI2015]网络吞吐量(spfa+网络流)

    3931: [CQOI2015]网络吞吐量 题目:传送门 题解: 现在有点难受....跳了一个多钟...菜啊... 题意都把做法一起给了....最短路+网路流啊. 不想说话...记得开long lon ...

  4. 【BZOJ3931】【CQOI2015】网络吞吐量(最短路,网络流)

    [BZOJ3931][CQOI2015]网络吞吐量(最短路,网络流) 题面 跑到BZOJ上去看把 题解 网络流模板题??? SPFA跑出最短路,重新建边后 直接Dinic就行了 大火题嗷... #in ...

  5. bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...

  6. BZOJ 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1555  Solved: 637[Submit][Stat ...

  7. G_M_网络流A_网络吞吐量

    调了两天的代码,到最后绝望地把I64d改成lld就过了,我真的是醉了. 网络吞吐量 题面:给出一张(n个点,m条边)带权(点权边权均有)无向图,点权为每个点每秒可以接受发送的最大值,边权为花费,保证数 ...

  8. bzoj3931: [CQOI2015]网络吞吐量

    将最短路图找出来,跑maxflow即可.有注意到数据范围.然后输出的时候%dWA了三次QAQ... #include<cstdio> #include<cstring> #in ...

  9. BZOJ 3931: [CQOI2015]网络吞吐量 最大流

    3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

随机推荐

  1. idea svn配置报错:Can't use Subversion command line client:svn

    1. 在Intellij IDEA里checkout东西时出先这个错误提示:Can't use Subversion command line client:svnSubversion command ...

  2. RHEL7恢复root密码

    RHEL7恢复root密码 首先关闭SELINUX [root@panda ~]# getenforce Disabled 然后重启,按↑↓键,进入如下界面,选择第一项,按下e键进行编辑 在此界面找到 ...

  3. reactnative的js里的super的作用

    class Blink extends Component{ constructor(props){ super(props); this.state = { showText: true }; se ...

  4. SQL查询数据并插入新表

    SQL查询数据并插入新表 --如果接受数据导入的表已经存在 insert into 表 select * from tablename --如果导入数据并生成表 select * into 表 fro ...

  5. 一元线性回归与R语言

    (https://mirrors.tuna.tsinghua.edu.cn/CRAN/)下载好R之后打开,就可以输入命令,如下,我输入 > y=c(61,57,58,40,90,35,68)  ...

  6. Windows Phone MultiBinding :Cimbalino Toolkit

    在WPF和WIN8中是支持MultiBinding 这个有啥用呢,引用下MSDN的例子http://msdn.microsoft.com/en-us/library/system.windows.da ...

  7. 使用docker部署.net core应用

    CentOS 使用VS2017新建一个asp.net core项目 发布web应用程序 使用FTP工具,将程序文件copy到linux上 XShell连上linux并登陆 cd /CoreWebDem ...

  8. la4394

    题解: 首先区间dp是比较好想到的 然后我感觉接下来就是乱搞... 我们会发现接下来的操作 无非就是 用一种颜色去覆盖这整个区间 然后在做 于是我用了比较暴力的做法,f[i][j][k]表示i-j这段 ...

  9. 真的分治fft

    以前学的分治fft f[i]=sigma(f[i-x]*g[x]),其中g[x]已知 那么我们可以用cdq分治来做(l,mid 对mid+1,t的影响) 而现在的$f[i]=sum(f(i-x)*f( ...

  10. Busybox制作ARM(iTOP4412) 根文件系统

    本记录来源与自身操作过程. 1.制作环境 PC环境:外部Winows8.1 内部则为vmware11+ubuntu12.04 嵌入式设备:iTOP4412 交叉工具:arm-none-linux-gn ...