这个题貌似时最小瓶颈路的前身,单次离线查询。
思路:
1.最小生成树 k r u s k a l kruskal kruskal,当 s , t s,t s,t连通时的对应边权值为答案。
#include
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
#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+ bfs∣dfs+二分,二分答案,判断 s , t s,t s,t是否连通即可。
#include
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的神仙做法,不会。