BZOJ3732: Network

3732: Network

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 89  Solved: 30
[Submit][Status]

Description

给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。 
图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).

现在有 K个询问 (1 < = K < = 15,000)。 
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Input

第一行: N, M, K。 
第2..M+1行: 三个正整数:X, Y, and D (1 <= X <=N; 1 <= Y <= N). 表示X与Y之间有一条长度为D的边。 
第M+2..M+K+1行: 每行两个整数A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Output

 对每个询问,输出最长的边最小值是多少。

Sample Input

6 6 8
1 2 5
2 3 4
3 4 3
1 4 8
2 5 7
4 6 2
1 2
1 3
1 4
2 3
2 4
5 1
6 2
6 1

Sample Output

5
5
5
4
4
7
4
5

HINT

 

1 <= N <= 15,000 

1 <= M <= 30,000 

1 <= d_j <= 1,000,000,000 

1 <= K <= 15,000 

 

Source

题解:

裸倍增。。。

终于能1A这种题了 ,交的时候忽然想到万一图不连通就被坑死了,结果A了,还是出题人比较良心。。。

代码:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<iostream>
  7 #include<vector>
  8 #include<map>
  9 #include<set>
 10 #include<queue>
 11 #include<string>
 12 #define inf 1000000000
 13 #define maxn 100000
 14 #define maxm 100000
 15 #define eps 1e-10
 16 #define ll long long
 17 #define pa pair<int,int>
 18 #define for0(i,n) for(int i=0;i<=(n);i++)
 19 #define for1(i,n) for(int i=1;i<=(n);i++)
 20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 22 #define mod 1000000007
 23 using namespace std;
 24 inline int read()
 25 {
 26     int x=0,f=1;char ch=getchar();
 27     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 28     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
 29     return x*f;
 30 }
 31 int n,m,k,head[maxn],tot,fa[maxn],f[maxn][20],g[maxn][20],dep[maxn];
 32 struct rec{int x,y,w;}a[maxm];
 33 struct edge{int go,next,w;}e[2*maxn];
 34 inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);};
 35 inline void insert(int x,int y,int z)
 36 {
 37     e[++tot].go=y;e[tot].next=head[x];e[tot].w=z;head[x]=tot;
 38     e[++tot].go=x;e[tot].next=head[y];e[tot].w=z;head[y]=tot;
 39 }
 40 inline bool cmp(rec a,rec b)
 41 {
 42     return a.w<b.w;
 43 }
 44 void dfs(int x)
 45 {
 46     for1(i,15)
 47      if((1<<i)<=dep[x])
 48       {
 49           int y=f[x][i-1];
 50           f[x][i]=f[y][i-1];
 51           g[x][i]=max(g[x][i-1],g[y][i-1]);
 52       }
 53      else break;
 54     for(int i=head[x],y;i;i=e[i].next)
 55      if(!dep[y=e[i].go])
 56       {
 57           dep[y]=dep[x]+1;
 58         f[y][0]=x;g[y][0]=e[i].w;
 59         dfs(y);
 60       }
 61 }
 62 int query(int x,int y)
 63 {
 64     int ans=0;
 65     if(dep[x]<dep[y])swap(x,y);
 66     int t=dep[x]-dep[y];
 67     for0(i,15)
 68      if(t&(1<<i))
 69       {
 70           ans=max(ans,g[x][i]);x=f[x][i];
 71       }
 72     if(x==y)return ans;  
 73     for3(i,15,0)
 74      if(f[x][i]!=f[y][i])
 75       {
 76         ans=max(ans,g[x][i]);x=f[x][i];
 77         ans=max(ans,g[y][i]);y=f[y][i];
 78       }
 79     ans=max(ans,max(g[x][0],g[y][0]));
 80     return ans;
 81 }
 82 int main()
 83 {
 84     freopen("input.txt","r",stdin);
 85     freopen("output.txt","w",stdout);
 86     n=read();m=read();k=read();
 87     for1(i,m)a[i].x=read(),a[i].y=read(),a[i].w=read();
 88     sort(a+1,a+m+1,cmp);
 89     for1(i,n)fa[i]=i;
 90     int j=1;
 91     for1(i,n-1)
 92     {
 93         while(find(a[j].x)==find(a[j].y))j++;
 94         fa[find(a[j].x)]=find(a[j].y);
 95         insert(a[j].x,a[j].y,a[j].w);
 96         j++;
 97     }
 98     dep[1]=1;
 99     dfs(1);
100     while(k--)printf("%d\n",query(read(),read()));
101     return 0;
102 }
View Code

 

posted @ 2014-10-02 15:44  ZYF-ZYF  Views(226)  Comments(0Edit  收藏  举报