- 货车运输
- 2017-10-22 22:38:20 @
倍增求lca的时候先更新x,y再更新的路径上的边权最小值,调了2个小时,悲催啊。。。。
AC代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=1e4+10;
const int inf=0x3f3f3f3f;
struct edge{
int from,nxt,to,w;
}e[maxn*20],ed[maxn*10];
int last[maxn],cnt,n,m,dep[maxn],f[maxn][25],c[maxn][25],fa[maxn];
vector<int> Set_of_edge;
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
inline void insert(int u,int v,int c)
{
e[++cnt]=(edge){u,last[u],v,c};last[u]=cnt;
e[++cnt]=(edge){v,last[v],u,c};last[v]=cnt;
}
inline void dfs(int cur,int pre)
{
f[cur][0]=pre,dep[cur]=dep[pre]+1;
for(register int i=1;i<=20;i++)
{
f[cur][i]=f[f[cur][i-1]][i-1];
c[cur][i]=min(c[f[cur][i-1]][i-1],c[cur][i-1]);
}
for(register int i=last[cur];i;i=e[i].nxt)
{
register int v=e[i].to;
if(v==pre) continue;
c[v][0]=e[i].w;
dfs(v,cur);
}
}
inline int lca(int x,int y)
{
int ret=inf;
if(x==y) return 0;
if(dep[x]<dep[y])swap(x,y);
for(register int i=20;i>=0;i--)
{
if((dep[x]-dep[y])>=(1<<i)) ret=min(ret,c[x][i]),x=f[x][i];
}
if(x==y) return ret;
for(register int i=20;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
ret=min(min(c[x][i],c[y][i]),ret);
x=f[x][i],y=f[y][i];
}
}
if(x==y) return ret;
return min(min(c[x][0],c[y][0]),ret);
}
inline bool comp(const edge &a,const edge &b)
{
return a.w>b.w;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++)
{
int u=read(),v=read(),c=read();
ed[i].from=u,ed[i].to=v,ed[i].w=c;
}
sort(ed+1,ed+1+m,comp);
for(int i=1;i<=n;i++) fa[i]=i;
for(register int i=1;i<=m;i++)
{
int fx=find(ed[i].from),fy=find(ed[i].to);
if(fx==fy) continue;
Set_of_edge.push_back(i),fa[fx]=fy;
}
for(register int i=0;i<Set_of_edge.size();i++)
insert(ed[Set_of_edge[i]].from,ed[Set_of_edge[i]].to,ed[Set_of_edge[i]].w);
dep[1]=1;
dfs(1,0);
int q=read();
while(q--)
{
int s=read(),t=read();
if(find(s)!=find(t)){puts("-1");continue;}
printf("%d\n",lca(s,t));
}
return 0;
}
0 条评论
目前还没有评论...
信息
- ID
- 1843
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 5319
- 已通过
- 954
- 通过率
- 18%
- 被复制
- 10
- 上传者