BZOJ3931网络吞吐量
来源:互联网 发布:super java 编辑:程序博客网 时间:2024/06/06 03:35
3931: [CQOI2015]网络吞吐量
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 938 Solved: 411
[Submit][Status][Discuss]
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
描述即题解。。
跑一遍堆优化dijkstra,然后把不经过最短路的点拆掉,然后剩下的点跑一遍dinic。。
Attention:
①注意开long long。。
②最好打当前弧优化,虽然不打我也不知道什么后果。。
③路由器的吞吐量需要i和i+n连边。。边权为inf
④inf一定要开的足够大,在long long范围内比较大的值,我%了黄学长的姿势,开的100000000000000LL
⑤数组开的不用像我这么大。。就题目要求的范围即可
附上本蒟蒻的代码:
#include<cstdio>#include<queue>#include<vector>#include<cstring>using namespace std;#define pa pair<int,int>#define inf 100000000000000LLint n,m,cnt=1,h[600001],a[100001],b[100001],d[100001],que[600001],flow,head,tail,x;struct node{ int to,next; long long v;};node edge[600001];long long ans,sum=0,dis[600001];int read(){ int w=0,c=1; char ch=getchar(); while (ch<'0' || ch>'9') { if (ch=='-') c=-1; ch=getchar(); } while (ch>='0' && ch<='9') { w=w*10+ch-'0'; ch=getchar(); } return w*c;}void add(int u,int v,long long w){ cnt++; edge[cnt].to=v; edge[cnt].next=h[u]; h[u]=cnt; edge[cnt].v=w;}void dijkstra(){ int i,now; priority_queue<pa,vector<pa>,greater<pa> >q; for (i=1;i<=n;i++) dis[i]=0x7fffffff; dis[1]=0; q.push(make_pair(0,1)); while (!q.empty()) { now=q.top().second; q.pop(); for (i=h[now];i;i=edge[i].next) if (dis[now]+edge[i].v<dis[edge[i].to]) { dis[edge[i].to]=dis[now]+edge[i].v; q.push(make_pair(dis[edge[i].to],edge[i].to)); } }}bool bfs(){ int j,p; memset(dis,-1,sizeof(dis)); que[1]=1; dis[1]=0; head=0,tail=1; while (head<tail) { head++; j=que[head]; p=h[j]; while (p) { if (dis[edge[p].to]<0 && edge[p].v>0) { dis[edge[p].to]=dis[j]+1; tail++; que[tail]=edge[p].to; } p=edge[p].next; } } if (dis[n*2]>0) return true; else return false;}long long dfs(int x,long long f){ int i=h[x]; long long used=0,w; if (x==n*2) return f; while (i) { if (edge[i].v && dis[edge[i].to]==dis[x]+1) { w=f-used; w=dfs(edge[i].to,min(w,edge[i].v)); edge[i].v-=w; edge[i^1].v+=w; used+=w; if (used==f) return f; } i=edge[i].next; } if (!used) dis[x]=-1; return used;}int main(){ int i; n=read(); m=read(); for (i=1;i<=m;i++) { a[i]=read(); b[i]=read(); d[i]=read(); add(a[i],b[i],d[i]); add(b[i],a[i],d[i]); } dijkstra(); memset(edge,0,sizeof(edge)); memset(h,0,sizeof(h)); cnt=1; for (i=1;i<=m;i++) { if (dis[a[i]]+d[i]==dis[b[i]]) { add(a[i]+n,b[i],inf); add(b[i],a[i]+n,0); } if (dis[b[i]]+d[i]==dis[a[i]]) { add(b[i]+n,a[i],inf); add(a[i],b[i]+n,0); } } for (i=1;i<=n;i++) { flow=read(); if (i!=1 && i!=n) add(i,i+n,flow); else add(i,i+n,inf); add(i+n,i,0); } ans=0; while (bfs()) while (sum=dfs(1,inf)) ans+=sum; printf("%lld",ans); return 0;}
- bzoj3931[CQOI2015]网络吞吐量
- bzoj3931【CQOI2015】网络吞吐量
- BZOJ3931网络吞吐量
- BZOJ3931 网络吞吐量(最大流)
- [BZOJ3931] [CQOI2015]网络吞吐量 && 网络流
- [BZOJ3931][CQOI2015][网络流]网络吞吐量[水题]
- bzoj3931: [CQOI2015]网络吞吐量 网络流
- 【bzoj3931】【CQOI2015】【网络吞吐量】【spfa+最大流】
- cqoi2015网络吞吐量(bzoj3931,洛谷3171)
- [bzoj3931][CQOI2015]网络吞吐量 spfa+最大流
- 【BZOJ3931】【CQOI2015】网络吞吐量 最短路+网络流
- 【BZOJ3931】【CQOI2015】网络吞吐量(最短路,网络流)
- [BZOJ3931][CQOI2015]网络吞吐量(SPFA+网络最大流)
- [BZOJ3931]CQOI2015网络吞吐量|最短路|最大流
- [BZOJ3931][CQOI2015]网络吞吐量(spfa+最大流)
- 网络吞吐量
- 网络吞吐量
- bzoj-3931 网络吞吐量
- [6] CMake总结 - 3 IF WHILE FOREACH MACRO FUNCTION
- python
- ASP.NET 中 Winform 的一些使用
- Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE envrinment
- mac 远程 window 插件
- BZOJ3931网络吞吐量
- HDU 1115 Lifting the Stone
- 哈希表基本操作
- 【最长公共子序列 - (nm)】
- USACO 1.2 milk2
- flash的google地图
- MongoDB学习笔记之-- MongoDB安装与配置(CentOS6.5)
- hdu5536 Chip Factory
- Android Activity生命周期整理