路由是指通過計算機網路把資訊從源位址傳輸到目的位址的活動,也是計算機網路設計中的重點和難點。網路中實現路由**的硬體裝置稱為路由器。為了使資料報最快的到達目的地,路由器需要選擇最優的路徑**資料報。例如在常用的路由演算法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
2060
1對於100%的資料,n<=500,m<=100000,d,c<=10^9
正解思路:最短路+最大流1.跑出最短路[可能有多條] (貌似dj比spfa快??)
2.將所有最短路上的邊連到網路流的圖上[將u+n節點與v節點連邊,容量為inf]
3.拆點,限制流量[將i節點與i+n節點連邊,容量為節點的吞吐量] (1節點和n節點連邊時的容量置為inf)
4.跑最大流
實現時的難點:
對於步驟2
一開始寫的dfs,不好寫,可以過樣例,但是會tle和re.
後來在網上看到一種方法:
以n節點為起點再跑一遍最短路,
列舉每條邊,
若有:dist[1][i]+w(i,j)+dist[j][n]==dist[1][n]
則該邊一定在最短路上.
實現時的坑點:
inf需要很大,1e9是不夠的
#define rg register
#define ll long long
#define inf (1ll<<60)
#include#include#include#includeusing namespace std;
const int n=505,nn=2000,m=1e5+5;
inline ll read()
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}inline ll minn(ll a,ll b) }}
inline bool bfs()
} }return dep[t]!=0;
}ll dfs(ll now,ll flow)
} }return 0;
}int main()
dijkstra(1,0);
dijkstra(n,1);
cnt=1;
for(ll i=1;i<=m;i++) //連邊
for(ll i=1;i<=n;i++) //拆點
s=1;t=2*n;
while(bfs())
printf("%lld\n",ans);
return 0;
}
CQOI2015 網路吞吐量(網路流 SPFA)
路由是指通過計算機網路把資訊從源位址傳輸到目的位址的活動,也是計算機網路設計中的重點和難點。網路中實現路由 的硬體裝置稱為路由器。為了使資料報最快的到達目的地,路由器需要選擇最優的路徑 資料報。例如在常用的路由演算法ospf 開放式最短路徑優先 中,路由器會使用經典的dijkstra演算法計算最短路...
CQOI2015 網路吞吐量 最大流板題
不開longlong 毀一生。luogu傳送門 首先先跑乙個最短路上的所有最短路徑,然後加入圖中跑一次最大流就可以,還是比較裸的一道題。if dis x len y dis y 則這條路在最短路上。然後看每個點的吞吐量限制,我們將每個路由器拆成兩個點來考慮,從乙個點到這個點的映象結點的容量為其限制就...
3931 CQOI2015 網路吞吐量
time limit 10 sec memory limit 512 mb submit 1536 solved 628 submit status discuss 路由是指通過計算機網路把資訊從源位址傳輸到目的位址的活動,也是計算機網路設計中的重點和難點。網路中實現路由 的硬體裝置稱為路由器。為了...