bzoj3931 [CQOI2015]网络吞吐量

网友投稿 258 2022-09-16

bzoj3931 [CQOI2015]网络吞吐量

​​ 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 题意 要求每条增广路必须是 最短路 然后每个点都有通过的一个权值限制 相当于 我在节点有限制的情况下 求一下最短路的条数有多少 首先一遍spfa找出s->t的最短路 本来还想反向再一遍spfa 验证一下这条边是否在最短路上 但是膜了icefox巨佬的blog 发现一遍spfa即可验证 因为 如果那个点不能到汇点 最后网络流的时候那个点也不可能到达汇点 产生贡献 然后这之后就拆点跑最大流即可(注意双向qwq 我wa很久菜死

#include#include#include#include#define M 110000#define inf 0x3f3f3f3f#define ll long long #define N 1100using namespace std;inline char gc(){ static char now[1<<16],*S,*T; if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;} return *S++;}inline int read(){ int x=0;char ch=gc(); while(ch<'0'||ch>'9') ch=gc(); while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=gc();return x;}struct node{ int x,y,z1,next,z;}data1[M<<1],data[M<<2];int h[N],level[N],cur[N],num,T,n,m;inline void insert1(int x,int y,int z,int z1){ data1[++num].y=y;data1[num].x=x;data1[num].next=h[x];h[x]=num;data1[num].z=z; data1[++num].y=x;data1[num].x=y;data1[num].next=h[y];h[y]=num;data1[num].z=z1;}inline void insert1(int x,int y,int z){ data[++num].y=y;data[num].z=z;data[num].next=h[x];h[x]=num;data[num].x=x; data[++num].y=x;data[num].z=0;data[num].next=h[y];h[y]=num;data[num].x=y;}inline bool bfs(){ memset(level,0,sizeof(level));level[n+1]=1;queueq;q.push(n+1); while(!q.empty()){ int x=q.front();q.pop(); for (int i=h[x];i;i=data[i].next){ int y=data[i].y,z=data[i].z; if(level[y]||!z) continue;level[y]=level[x]+1;q.push(y);if (y==T) return 1; } }return 0;}inline ll dfs(int x,ll s){ if (x==T) return s;ll ss=s; for (int &i=cur[x];i;i=data[i].next){ int y=data[i].y;ll z=data[i].z; if (level[x]+1==level[y]&&z){ ll xx=dfs(y,min(z,s));if (!xx) level[y]=0; s-=xx;data[i].z-=xx;data[i^1].z+=xx;if(!s) return ss; } }return ss-s;} ll f[N];bool flag[N];inline void spfa(){ queueq;for (int i=1;i<=n;++i) f[i]=1LL<<60;memset(flag,0,sizeof(flag));flag[1]=1;f[1]=0;q.push(1); while(!q.empty()){ int x=q.front();q.pop();flag[x]=0; for (int i=h[x];i;i=data1[i].next){ int y=data1[i].y,z=data1[i].z; if (f[x]+z

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:bzoj2400 Spoj 839 Optimal Marks
下一篇:bzoj3029 守卫者的挑战
相关文章

 发表评论

暂时没有评论,来抢沙发吧~