qwb与学姐
Time Limit: 1 Sec Memory Limit: 128 MB
Description
qwb打算向学姐表白,可是学姐已经受够了他的骚扰,于是出了一个题想难住他:
已知一幅n个点m条边的无向图,定义路径的值为这条路径上最短的边的长度,
现在有
k个询问,
询问从A点到B点的所有路径的值的最大值。
qwb听完这个问题很绝望啊,聪明的你能帮帮他吗?
Input
一组数据。
第一行三个整数n,m,k
(1<=N<=50000,m<=200000,k<=100000)。
第2..m+1行:三个正整数:X, Y, and D (1 <=
X <=N; 1 <= Y <= N,1<=D<=215) 表示X与Y之间有一条长度为D的边。
第m+2..m+k+1行: 每行两个整数A
B(1<=A,B<=n且A≠B),意义如题目描述。
保证图连通。
Output
对于每个询问输出一行,一共k行,每行输出A点到B点的所有路径的值的最大值。
Sample Input
4 5 3 1 2 6 1 3 8 2 3 4 2 4 5 3 4 7 2 3 1 4 3 4
Sample Output
6 7 7分析:题目要求从A到B所有路径中权值最小值的最大值; 我们可以考虑构建一棵最大生成树,这样保证了最大值,然后问题变为A到B求路径上最小值;代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <bitset> #include <map> #include <queue> #include <stack> #include <vector> #include <cassert> #include <ctime> #include<unordered_map> #define rep(i,m,n) for(i=m;i<=n;i++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define sys system("pause") const int maxn=5e4+10; const int N=5e2+10; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;} int n,m,k,t,fa[20][maxn],mi[20][maxn],p[maxn],dep[maxn]; int find(int x){return p[x]==x?x:p[x]=find(p[x]);} struct node { int x,y,z; bool operator<(const node&p)const { return z>p.z; } }e[maxn<<2]; vector<pii>f[maxn]; void dfs(int x,int y) { dep[x]=dep[y]+1; fa[0][x]=y; for(int i=1;fa[i-1][fa[i-1][x]];i++) { fa[i][x]=fa[i-1][fa[i-1][x]]; mi[i][x]=min(mi[i-1][x],mi[i-1][fa[i-1][x]]); } for(int i=0;i<f[x].size();i++) { int z=f[x][i].fi,w=f[x][i].se; if(z==y)continue; mi[0][z]=w; dfs(z,x); } } int gao(int x,int y) { int ret=1e9; if(dep[x]<dep[y])swap(x,y); for(int i=19;i>=0;i--)if(dep[fa[i][x]]>=dep[y])ret=min(ret,mi[i][x]),x=fa[i][x]; if(x==y)return ret; for(int i=19;i>=0;i--) { if(fa[i][x]!=fa[i][y]) { ret=min(ret,mi[i][x]); ret=min(ret,mi[i][y]); x=fa[i][x]; y=fa[i][y]; } } ret=min(ret,mi[0][x]); ret=min(ret,mi[0][y]); return ret; } int main() { int i,j; scanf("%d%d%d",&n,&m,&k); rep(i,1,m) { scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z); } rep(i,1,n)p[i]=i; sort(e+1,e+m+1); int cnt=0; rep(i,1,m) { int x=find(e[i].x),y=find(e[i].y); if(x!=y) { p[x]=y; f[e[i].x].pb(mp(e[i].y,e[i].z)); f[e[i].y].pb(mp(e[i].x,e[i].z)); if(++cnt==n-1)break; } } dfs(1,0); while(k--) { int x,y; scanf("%d%d",&x,&y); printf("%d\n",gao(x,y)); } return 0; }
时间: 2024-10-13 10:41:58