BZOJ3931 網路吞吐量

2022-09-11 04:51:12 字數 2918 閱讀 8247

time limit: 10 sec  memory limit: 512 mb

submit: 1692  solved: 697

[submit][status][discuss]

路由是指通過計算機網路把資訊從源位址傳輸到目的位址的活動,也是計算機網路設計中的重點和難點。網路中實現路由**的硬體裝置稱為路由器。為了使資料報最快的到達目的地,路由器需要選擇最優的路徑**資料報。例如在常用的路由演算法ospf(開放式最短路徑優先)中,路由器會使用經典的dijkstra演算法計算最短路徑,然後盡量沿最短路徑**資料報。現在,若已知乙個計算機網路中各路由器間的連線情況,以及各個路由器的最大吞吐量(即每秒能**的資料報數量),假設所有資料報一定沿最短路徑**,試計算從路由器1到路由器n的網路的最大吞吐量。計算中忽略**及傳輸的時間開銷,不考慮鏈路的頻寬限制,即認為資料報可以瞬間通過網路。路由器1到路由器n作為起點和終點,自身的吞吐量不用考慮,網路上也不存在將1和n直接相連的鏈路。

輸入檔案第一行包含兩個空格分開的正整數n和m,分別表示路由器數量和鏈路的數量。網路中的路由器使用1到n編號。接下來m行,每行包含三個空格分開的正整數a、b和d,表示從路由器a到路由器b存在一條距離為d的雙向鏈路。 接下來n行,每行包含乙個正整數c,分別給出每乙個路由器的吞吐量。

輸出乙個整數,為題目所求吞吐量。

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

1100

2050

2060170

對於100%的資料,n≤500,m≤100000,d,c≤10^9

solution:

先跑最短路

拆點,每個點拆成兩個點

對於dis[i]+e(i,j)==dis[j]的邊,我們連i'到j容量為inf的邊

對於i到i' 我們連c[i]的邊(1和n除外)

最後跑dinic即是

正確性:我們可以認為先是x的流到了某個點然後被濾掉了某些流量

/*

to the end of the galaxy

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define debug(x) cerr<

#define llinf 0x7fffffffffffll

using

namespace

std;

typedef pair

pii;

typedef

long

long

ll;inline

intinit()

else

if(flag)return now*ju;

}}inline

long

long

llinit()

else

if(flag)return now*ju;

}}int head[1505

];ll dis[

1505

];bool vis[1505

];int cnt=0

;struct

road

e[200005

];struct

edge

edge[

2000005

];inline

void insert(int

from,int

to,ll val)

); head[

from]=cnt;

}inline

void addedge(int

from,int

to,ll cap)

); head[

from]=cnt;

++cnt;

edge[cnt]=((edge));

head[to]=cnt;

}int s=1

,t,n,m;

priority_queue

,greater>q;

inline

void

dijkstra()

dis[

1]=0

; q.push(make_pair(

0,1));

while(!q.empty())}}

}int v[1505],cur[1505

];queue

q;bool

bfs()

dis[

1]=1

; q.push(1);

while(!q.empty())}}

return

false;}

ll dfs(

intnow,ll maxflow)

}return

flow;

}ll dinic()

return

ans;

}int

main()

for(int i=1;i<=n;i++)

dijkstra();

cnt=0

; memset(head,

0,sizeof

(head));

for(int i=1;i<=n;i++)

for(int i=1;i<=2*m;i++)

}printf(

"%lld\n

",dinic());

return0;

}

view code

bzoj3931 網路流 最短路 網路吞吐量

description 路由是指通過計算機網路把資訊從源位址傳輸到目的位址的活動,也是計算機網路設計中的重點和難點。網路中實現路由 的硬體裝置稱為路由器。為了使資料報最快的到達目的地,路由器需要選擇最優的路徑 資料報。例如在常用的路由演算法ospf 開放式最短路徑優先 中,路由器會使用經典的dijk...

3931 CQOI2015 網路吞吐量

time limit 10 sec memory limit 512 mb submit 1536 solved 628 submit status discuss 路由是指通過計算機網路把資訊從源位址傳輸到目的位址的活動,也是計算機網路設計中的重點和難點。網路中實現路由 的硬體裝置稱為路由器。為了...

3931 CQOI2015 網路吞吐量

題目鏈結 題目大意 求最短路樹上的最大流 題解 定義最短路樹如下 從源點1經過邊集t到任意一點i有且僅有一條路徑,且這條路徑是整個圖1到i的最短路徑,邊集t構成最短路樹。然後建圖就好了 我的收穫 最短路樹的應用 include include include include include usin...