P1396 营救(最小瓶颈路)

P1396 营救(最小瓶颈路)

这个题貌似时最小瓶颈路的前身,单次离线查询。

思路:

1.最小生成树 k r u s k a l kruskal ,当 s , t s,t 连通时的对应边权值为答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define reg register
#define PII pair<int,int>
#define pb push_back
int n,m,s,t,fa[N];
struct edge{
	int x,y,w;
	bool operator<(const edge&e)const{
		return w<e.w;
	}
}e[N<<1];
int find(int x){
	return fa[x]==x?x:find(fa[x]); 
} 
int main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int  i=1;i<=m;i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
	sort(e+1,e+m+1);
	for(int i=1;i<=m;i++){
		int fx=find(fa[e[i].x]),fy=find(fa[e[i].y]);
		if(fx!=fy) fa[fy]=fx;
		if(find(s)==find(t)){
			printf("%d\n",e[i].w);
			break;
		} 
	}
	return 0;
}

2. b f s d f s + bfs|dfs+ 二分,二分答案,判断 s , t s,t 是否连通即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define pb push_back
int n,m,s,t,h[N],cnt;
struct edge{
	int to,nt,w;
}e[N<<2];
void add(int u,int v,int w){
	e[++cnt]={v,h[u],w},h[u]=cnt;
	e[++cnt]={u,h[v],w},h[v]=cnt;
}
bool bfs(int x){
	bool vis[N]={};
	queue<int>q;q.push(s),vis[s]=true;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=h[u];i;i=e[i].nt)
			 if(e[i].w<=x&&!vis[e[i].to])	vis[e[i].to]=true,q.push(e[i].to);
	}
	return vis[t]?true:false;
}
int main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	int l=1e5,r=0;
	for(int  i=1,u,v,w;i<=m;i++){
	scanf("%d%d%d",&u,&v,&w),add(u,v,w);
	if(l>w) l=w;
	if(r<w) r=w;
	}
	while(l<r){
		int mid=(l+r)>>1;
		if(bfs(mid)) r=mid;
		else l=mid+1;
	}
	printf("%d\n",l);
	return 0;
}

3.跑最短路,改为求最大路径权值的最小值即可,这个就不写代码了。

4.貌似还有什么倍增LCA的神仙做法,不会。

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107716679