BZOJ3931网络吞吐量
2016-02-05 16:20
316 查看
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
⑤数组开的不用像我这么大。。就题目要求的范围即可
附上本蒟蒻的代码:
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 100000000000000LL int 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; }
相关文章推荐
- HttpServlet详解
- C#中使用HttpWebRequest提交MultiPart数据
- Xcode7 不允许明码HTTP请求
- tcp/udp socket连接
- 发布一个改写自muduo的C++网络I/O库
- 神经网络、 流形和拓扑介绍
- ubuntu系统找不到无线网络图标处理办法
- Android网络开源库Android-async-http 的基本用法(二)
- Android网络开源库Android-async-http 的基本用法(一)
- C#高性能TCP服务的多种实现方式
- AJP与HTTP比较和分析
- 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
- 计算机网络体系结构
- 计算机网络的结构组成
- [转] 转载:一条网线,不用路由器,多台笔记本电脑共享上网
- 《HTTP权威指南》学习笔记——URL和资源
- 计算机网络的特点及性能
- 计算机网络的类别
- 计算机网络的发展
- 计算机网络在信息时代的作用