1 solutions
-
0
C++ :
#include <cstdio> #include <queue> #include <cstring> #include <algorithm> #define MIN(a,b) ((a)>(b)?(b):(a)) using namespace std; int n,m,father[10010],tot,b[10010],deep[10010]; int f[10010][20],dis[10010][20]; struct ai{ int x,y,w,last; }a[100010]; struct at{ int x,y,w; }c[100010]; void jr(int x,int y,int w) { tot++; a[tot].x=x; a[tot].y=y; a[tot].w=w; a[tot].last=b[x]; b[x]=tot; } bool cop(const at &a,const at &b) { return a.w>b.w; } int getf(int x) { if(father[x]==x) return x; return father[x]=getf(father[x]); } void dfs(int x) { for(int i=1;i<=15;i++) { f[x][i]=f[f[x][i-1]][i-1]; dis[x][i]=MIN(dis[x][i-1],dis[f[x][i-1]][i-1]); } for(int i=b[x];i;i=a[i].last) { int y=a[i].y; if(!deep[y]) { deep[y]=deep[x]+1; f[y][0]=x; dis[y][0]=a[i].w; dfs(y); } } } void swap(int &a,int &b) { int c=a; a=b; b=c; } void bzlca(int x,int y) { int ans=0x3fffffff; if(deep[x]<deep[y]) swap(x,y); for(int i=15;i>=0;i--) { if(deep[f[x][i]]>=deep[y]) { ans=MIN(ans,dis[x][i]); x=f[x][i]; } } if(x==y) { printf("%d\n",ans); return; } for(int i=15;i>=0;i--) { if(f[x][i]!=f[y][i]) { ans=MIN(MIN(dis[x][i],ans),dis[y][i]); x=f[x][i]; y=f[y][i]; } } ans=MIN(MIN(dis[x][0],dis[y][0]),ans); printf("%d\n",ans); return; } int main() { memset(dis,0x3f,sizeof(dis)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { father[i]=i; } for(int i=1;i<=m;i++) { scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].w); } sort(c+1,c+m+1,cop); for(int i=1;i<=m;i++) { int a=getf(c[i].x); int b=getf(c[i].y); if(a!=b) { father[a]=b; jr(c[i].x,c[i].y,c[i].w); jr(c[i].y,c[i].x,c[i].w); } } for(int i=1;i<=n;i++) { if(!deep[i]) { deep[i]=1; dfs(i); } } int q; scanf("%d",&q); for(int i=1;i<=q;i++) { int x,y; scanf("%d%d",&x,&y); if(getf(x)!=getf(y)) { printf("-1\n"); } else { bzlca(x,y); } } return 0; }
- 1
Information
- ID
- 18481
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By