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
原创粉丝点击