营救(洛谷-P1396)
生活随笔
收集整理的這篇文章主要介紹了
营救(洛谷-P1396)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
“咚咚咚……”“查水表!”原來是查水表來了,現在哪里找這么熱心上門的查表員啊!小明感動的熱淚盈眶,開起了門……
媽媽下班回家,街坊鄰居說小明被一群陌生人強行押上了警車!媽媽豐富的經驗告訴她小明被帶到了t區,而自己在s區。
該市有m條大道連接n個區,一條大道將兩個區相連接,每個大道有一個擁擠度。小明的媽媽雖然很著急,但是不愿意擁擠的人潮沖亂了她優雅的步伐。所以請你幫她規劃一條從s至t的路線,使得經過道路的擁擠度最大值最小。
輸入輸出格式
輸入格式:
第一行四個數字n,m,s,t。
接下來m行,每行三個數字,分別表示兩個區和擁擠度。
(有可能兩個區之間有多條大道相連。)
輸出格式:
輸出題目要求的擁擠度。
輸入輸出樣例
輸入樣例#1:
3 3 1 3?? ??? ??? ??? ??? ??? ??? ?
1 2 2
2 3 1
1 3 3
輸出樣例#1:
2
思路:最小瓶頸路模版題,添邊后二分答案即可
源代碼
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 100000+5; const int dx[] = {-1,1,0,0}; const int dy[] = {0,0,-1,1}; using namespace std; struct Edge {int to;int dis; } edge[N]; int head[N],next[N]; int vis[N]; int n,m,start,endd; int tot,mid; void add_edge(int u,int v,int w) {tot++;edge[tot].to=v;edge[tot].dis=w;next[tot]=head[u];head[u]=tot; } bool dfs(int x) {if(x==endd)return true;bool flag=false;vis[x]=1;for(int i=head[x]; i!=-1; i=next[i]) {int y=edge[i].to;int w=edge[i].dis;if(vis[y]||w>mid) {continue;}flag=flag|dfs(y);}return flag; } int main() {cin>>n>>m;//n個點m條邊cin>>start>>endd;//從start到enddint left=INF,right=-INF;memset(head,-1,sizeof(head));for(int i=1; i<=m; i++) {int u,v,w;scanf("%d%d%d",&u,&v,&w);left=min(left,w);right=max(right,w);add_edge(u,v,w);add_edge(v,u,w);}int ans;while(left<=right) {mid=(left+right)>>1;memset(vis,0,sizeof(vis));if(dfs(start)) {ans=mid;right=mid-1;}else {left=mid+1;}}cout<<ans<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的营救(洛谷-P1396)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串处理——字典树
- 下一篇: 数列分块入门 4(LibreOj-628