codevs 1519 过路费
来源:互联网 发布:网络安全法的特征是 编辑:程序博客网 时间:2024/04/28 23:18
题目描述 Description
在某个遥远的国家里,有 n个城市。编号为 1,2,3,…,n。这个国家的政府修建了m 条双向道路,每条道路连接着两个城市。政府规定从城市 S 到城市T需要收取的过路费为所经过城市之间道路长度的最大值。如:A到B长度为
2,B到C 长度为3,那么开车从 A经过 B到C 需要上交的过路费为 3。
佳佳是个做生意的人,需要经常开车从任意一个城市到另外一个城市,因此他需要频繁地上交过路费,由于忙于做生意,所以他无时间来寻找交过路费最低的行驶路线。然而,
当他交的过路费越多他的心情就变得越糟糕。 作为秘书的你,需要每次根据老板的起止城市,提供给他从开始城市到达目的城市,最少需要上交多少过路费。
输入描述 Input Description第一行是两个整数 n 和m,分别表示城市的个数以及道路的条数。接下来 m 行,每行包含三个整数 a,b,w(1≤a,b≤n,0≤w≤10^9),表示a与b之间有一条长度为 w的道路。接着有一行为一个整数 q,表示佳佳发出的询问个数。 再接下来 q行,每一行包含两个整数 S,T(1≤S,T≤n,S≠T), 表示开始城市S 和目的城市T。 输出描述 Output Description输出共q行,每行一个整数,分别表示每个询问需要上交的最少过路费用。输入数据保证所有的城市都是连通的。 样例输入 Sample Input
同货车运输【见这里】。
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct edge{ int x,y,w; bool operator < (const edge & eee) const { return w<eee.w; }}a[100010];int min(int x,int y){ return x>y?x:y;}int dep[10010],db_min[10010][17],db_to[10010][17],fir[10010],ne[20010],to[20010],w[20010],fa[10010],tot;bool vis[10010];void add(int f,int t,int l){ ne[++tot]=fir[f]; fir[f]=tot; to[tot]=t; w[tot]=l;}int find(int x){ if (fa[x]==x) return x; fa[x]=find(fa[x]); return fa[x];}void dfs(int u,int fa){ int i,j,k,v; for (i=fir[u];i;i=ne[i]) if (to[i]!=fa) { v=to[i]; db_to[v][0]=u; db_min[v][0]=w[i]; dep[v]=dep[u]+1; dfs(v,u); }}int main(){ int i,j,k,m,n,p,q,x,y,z,ans,tem; scanf("%d%d",&n,&m); for (i=1;i<=m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w); sort(a+1,a+m+1); for (i=1;i<=n;i++) fa[i]=i; for (i=1;i<=m;i++) if (find(a[i].x)!=find(a[i].y)) { fa[fa[a[i].x]]=fa[a[i].y]; add(a[i].x,a[i].y,a[i].w); add(a[i].y,a[i].x,a[i].w); } for (i=1;i<=n;i++) if (!vis[find(i)]) { vis[fa[i]]=1; dep[fa[i]]=0; dfs(fa[i],-1); } for (k=1;k<=15;k++) for (i=1;i<=n;i++) { db_to[i][k]=db_to[db_to[i][k-1]][k-1]; db_min[i][k]=min(db_min[i][k-1],db_min[db_to[i][k-1]][k-1]); } scanf("%d",&q); for (i=1;i<=q;i++) { scanf("%d%d",&x,&y); if (find(x)!=find(y)) { printf("0\n"); continue; } ans=0; if (dep[y]>dep[x]) { tem=y; y=x; x=tem; } for (k=15;dep[x]>dep[y];k--) if (dep[x]-(1<<k)>=dep[y]) { ans=min(ans,db_min[x][k]); x=db_to[x][k]; } if (x==y) { printf("%d\n",ans); continue; } for (k=15;k>=0;k--) if (db_to[x][k]!=db_to[y][k]) { ans=min(ans,min(db_min[x][k],db_min[y][k])); x=db_to[x][k]; y=db_to[y][k]; } ans=min(ans,min(db_min[x][0],db_min[y][0])); printf("%d\n",ans); }}
0 0
- codevs 1519 过路费
- 过路费[codevs 1519]
- codevs 1519 过路费
- codevs 1519 过路费
- CODEVS 1519 过路费
- Codevs 1519 过路费
- 【codevs 1519】过路费
- 【codevs 1519】过路费
- Codevs 1519 过路费(Mst+Lca)
- CODEVS 3287 货车运输&&CODEVS 1519 过路费
- codevs 过路费
- codevs 1519 过路费(最小生成树+LCA)
- codevs 1519 过路费(最小生成树+LCA)
- codevs 1519 过路费(最小生成树Kruskal算法+lca)
- CODE[VS] 1519 过路费
- WIKIOI 1519 过路费
- 过路费
- 过路费
- js获取url中的参数
- 编译service.jar包,push替换,reboot重启后无法开机
- GUVCview-Ubuntu下视频录像更简单
- 关于HTTP和HTTPS
- Git 基本用法
- codevs 1519 过路费
- android关闭硬件加速的方法:
- [Spring]Bean的自动装配
- js中replaceAll
- Android MVP架构浅析
- nginx打开网站提示 500错误解决方案 ([error] 1824#100074: *6 FastCGI sent in stderr: "PHP message: PHP Fatal error: Allowed memory size of 13
- 利用浏览器获得当前时间戳
- 可编辑文本框的转换
- 配置 VIM 的 HLSL 、 GLSL 的语法高亮文件