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. 从零开始学C#——不再更新,直接进入高阶教程

    从零开始学习C#不再更新,直接进入高阶教程. 入门教程,请自行谷歌.百度吧,有很多这样的教程. 编程是一件实践性很强的事情,那么接下来的文章将开始进行开发项目. 还在编程中迷茫的人们,先暂时放下一切的 ...

  2. 上手TensorFlow

    tensorflow中softmax_cross_entropy和sparse_softmax_cross_entropy的区别 都是softmax cross entropy损失函数,区别在于lab ...

  3. 微信小程序API 登录-wx.login(OBJECT) + 获取微信用户唯一标识openid | 小程序

    wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要 ...

  4. Unicode字符编码表

    十进制 十六进制  字符数 编码分类(中文) 编码分类(英文) 起始 终止 起始 终止 (个)     0 127 0000 007F 128 C0控制符及基本拉丁文 C0 Control and B ...

  5. centos的基本操作

    1.ssh连接阿里云一段时间不操作自动断开打开/etc/ssh/sshd_config添加或修改: ClientAliveInterval 120ClientAliveCountMax 0 2.挂载数 ...

  6. net core体系-web应用程序-4net core2.0大白话带你入门-2asp.net core新建项目

    新建asp.net core项目   开发环境:Windows Server R2 2008 开发工具:Microsoft Visual Studio 2017 新建asp.net core项目 创建 ...

  7. Codeforces 758F Geometrical Progression

    Geometrical Progression n == 1的时候答案为区间长度, n == 2的时候每两个数字都可能成为答案, 我们只需要考虑 n == 3的情况, 我们可以枚举公差, 其分子分母都 ...

  8. Linux LVM动态扩容

    引用自:  https://blog.csdn.net/u012439646/article/details/73380197   xfs_growfs /dev/centos/root  一.首先安 ...

  9. php通过CURL模拟get提交请求

    方式一: $host = "http://jisunews.market.alicloudapi.com"; $path = "/news/get"; $met ...

  10. python---文件读写-IO

    IO----文件操作,读操作 1.open('文件名','打开方式',mode[buff]);------------->第一个参数是文件路径,第二个参数是打开方式(如果不写,默认是只读),第三 ...