洛谷——P1396 营救
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷——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
说明
数据范围
30% n<=10
60% n<=100
100% n<=10000,m<=2n,拥挤度<=10000
题目保证1<=s,t<=n且s<>t,保证可以从s区出发到t区。
样例解释:
小明的妈妈要从1号点去3号点,最优路线为1->2->3。
这道题竟然可以用最小生成树做,他只问最小拥挤度,但没问总的最小拥挤度,所以就可以用最小生成树水过、、、
但在最后面要加上一小句话:
if(num==n-1||find(s)==find(t)) break;//判断如果s与t已经连通的话,那么就结束加边
同样这个题用最短路,spfa也可以照样水过。、。。裸地spfa,就是把求最短路之和改成求最大值就好了、、、
代码:
最小生成树
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 100100 using namespace std; int x,y,z,n,m,s,t,ans,num,fa[N]; struct Edge { int x,y,z; }edge[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} return x*f; } int cmp(Edge a,Edge b) { return a.z<b.z; } int find(int x) { if(x==fa[x]) return x; fa[x]=find(fa[x]); return fa[x]; } int main() { n=read(),m=read(),s=read(),t=read(); for(int i=1;i<=m;i++) { x=read(),y=read(),z=read(); edge[i].x=x; edge[i].y=y; edge[i].z=z; } for(int i=1;i<=n;i++) fa[i]=i; sort(edge+1,edge+1+m,cmp); for(int i=1;i<=m;i++) { x=edge[i].x,y=edge[i].y; int fx=find(x),fy=find(y); if(fx==fy) continue; fa[fx]=fy;num++; ans=max(ans,edge[i].z); if(num==n-1||find(s)==find(t)) break; } printf("%d",ans); return 0; }
最短路:
#include<queue> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 200000 #define maxn 99999999LL using namespace std; int n,m,x,y,z,s,t,tot; int dis[N],head[N]; struct Edge { int from,to,dis,next; }edge[N]; void add(int x,int y,int z) { tot++; edge[tot].to=y; edge[tot].dis=z; edge[tot].next=head[x]; head[x]=tot; } int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} return x*f; } int spfa(int s) { queue<int>q;bool vis[N]; for(int i=1;i<=n;i++) dis[i]=maxn,vis[i]=false; q.push(s),vis[s]=true,dis[s]=0; while(!q.empty()) { int x=q.front();q.pop(); for(int i=head[x];i;i=edge[i].next) { int t=edge[i].to; if(dis[t]>max(dis[x],edge[i].dis)) { dis[t]=max(dis[x],edge[i].dis); if(!vis[t]) { vis[t]=true; q.push(t); } } } vis[x]=false; } } int main() { n=read(),m=read(),s=read(),t=read(); for(int i=1;i<=m;i++) { x=read(),y=read(),z=read(); add(x,y,z); add(y,x,z); } spfa(s); printf("%d",dis[t]); }
以上是关于洛谷——P1396 营救的主要内容,如果未能解决你的问题,请参考以下文章