Networkios
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 3399 Solved: 1671
[Submit][Status][Discuss]
Descriptionspa
給你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 < = 20,000)。
每一個詢問的格式是:A B,表示詢問從A點走到B點的全部路徑中,最長的邊最小值是多少?blog
Inputip
第一行: 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點的全部路徑中,最長的邊最小值是多少?ci
Outputstring
對每一個詢問,輸出最長的邊最小值是多少。it
Sample Inputio
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 Outputclass
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,000stream
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 15100 using namespace std; struct abcd{ int x,y,f; bool operator < (const abcd &Y) const { return f < Y.f ; } }edges[M<<1]; int n,m,k; int belong[M],fa[M],size[M],dis[M],dpt[M]; int Find(int x) { if(!belong[x]) belong[x]=x,size[x]=1; if(belong[x]==x) return x; return belong[x]=Find(belong[x]); } int Get_Depth(int x) { if(dpt[x]) return dpt[x]; if(!fa[x]) return dpt[x]=1; return dpt[x]=Get_Depth(fa[x])+1; } void Kruskal() { int i; sort(edges+1,edges+m+1); for(i=1;i<=m;i++) { int x=Find(edges[i].x); int y=Find(edges[i].y); if(x==y) continue ; if(size[x]>size[y]) swap(x,y); belong[x]=y; size[y]=max(size[y],size[x]+1); fa[x]=y; dis[x]=edges[i].f; } } int Query(int x,int y) { if(dpt[x]<dpt[y]) swap(x,y); while(dpt[fa[x]]>dpt[y]) x=fa[x]; if(fa[x]==y) return dis[x]; if(dpt[x]!=dpt[y]) x=fa[x]; while(fa[x]!=fa[y]) x=fa[x],y=fa[y]; return max(dis[x],dis[y]); } inline char Get_Char() { static const int L=1<<15; static char buffer[L]; static char *S,*T; if(S==T) { T=(S=buffer)+fread(buffer,1,L,stdin); if(S==T) return EOF; } return *S++; } inline int Get_Int() { char c=Get_Char(); while(c<'0'||c>'9') c=Get_Char(); int re=0; while(c>='0'&&c<='9') re=(re<<3)+(re<<1)+(c-'0'),c=Get_Char(); return re; } int main() { int i,x,y; cin>>n>>m>>k; for(i=1;i<=m;i++) { edges[i].x=Get_Int(); edges[i].y=Get_Int(); edges[i].f=Get_Int(); } Kruskal(); for(i=1;i<=n;i++) Get_Depth(i); for(i=1;i<=k;i++) { x=Get_Int();y=Get_Int(); printf("%d\n", Query(x,y) ); } }