博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Noip2013货车运输
阅读量:4653 次
发布时间:2019-06-09

本文共 2875 字,大约阅读时间需要 9 分钟。

话说这一题我曾经写过,结果今天比赛的时候还是写错了。

这一题思路还是挺好想的吧,我们先写一遍最大生成树,然后做一遍LCA。
 至于这一题我是怎么错的呢。。。
 从下午查到现在,终于查出来了。很细节的一个错误。主要还是LCA写的不熟练,打错了一个字符。

int LCA(int x,int y){    if(depth[x]
=depth[y])ans=min(ans,dist[x][i]),x=f[x][i];    if(x==y)return ans;    per(i,LOG-1,0)if(f[x][i]!=f[y][i])ans=min(ans,min(dist[x][i],dist[y][i])),x=f[x][i],y=f[y][i];    ans=min(ans,min(dist[x][0],dist[y][0]));    return ans;}

这个里面第4行里面if里 depth[f[x][i]]>=depth[y],在考试时打成了depth[f[x][i]]<=depth[y],导致WA了19个点,拿了可怜的5分。

顺便纪念一下20170810测试因为一共打错6个字符由本来能ak的变成可怜的245
AC代码

#include
#include
#include
#include
using namespace std;#define rep(i,a,n) for(register int i=(a);i<=(n);++i)#define per(i,a,n) for(register int i=(a);i>=(n);--i)#define fec(i,x) for(register int i=head[x];i;i=Next[i])#define debug(x) printf("debug:%s=%d\n",#x,x)#define mem(a,x) memset(a,x,sizeof(a))template
inline void read(A&a){a=0;A f=1;int c=0;while(c<'0'||c>'9'){c=getchar();if(c=='-')f*=-1;}while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}a*=f;}template
inline void read(A&a,B&b){read(a);read(b);}template
inline void read(A&a,B&b,C&c){read(a);read(b);read(c);}const int maxn=10000+7,maxm=50000+7,LOG=20+1,INF=0x7f7f7f7f;struct Edge{ int u,v,w;}e[maxm];inline bool comp(const Edge &x,const Edge &y){ return x.w>y.w;}int n,m,q,x,y;int depth[maxn],f[maxn][LOG],dist[maxn][LOG];int u[maxn<<1],v[maxn<<1],w[maxn<<1],Next[maxn<<1],head[maxn],tot;inline void addedge(int x,int y,int z){ u[++tot]=x;v[tot]=y;w[tot]=z; Next[tot]=head[x];head[x]=tot;}int father[maxn];int find(int x){return x==father[x]?x:father[x]=find(father[x]);}inline void Union(int x,int y){if(find(x)!=find(y))father[find(y)]=find(x);}inline void UFS_init(){rep(i,1,n)father[i]=i;}void Kruskal(){ UFS_init(); sort(e+1,e+m+1,comp); rep(i,1,m){ int x=e[i].u,y=e[i].v,z=e[i].w; if(find(x)!=find(y)){ Union(x,y); addedge(x,y,z); addedge(y,x,z); } }}void dfs(int x){ depth[x]=depth[f[x][0]]+1; rep(i,1,LOG-1)f[x][i]=f[f[x][i-1]][i-1],dist[x][i]=min(dist[f[x][i-1]][i-1],dist[x][i-1]); fec(i,x){ int y=v[i]; if(depth[y])continue; f[y][0]=x;dist[y][0]=w[i]; dfs(y); }}int LCA(int x,int y){ if(depth[x]
=depth[y])ans=min(ans,dist[x][i]),x=f[x][i];// debug(ans); if(x==y)return ans; per(i,LOG-1,0)if(f[x][i]!=f[y][i])ans=min(ans,min(dist[x][i],dist[y][i])),x=f[x][i],y=f[y][i]; ans=min(ans,min(dist[x][0],dist[y][0])); return ans;}void Init(){ mem(dist,0x7f); read(n,m); rep(i,1,m)read(e[i].u,e[i].v,e[i].w);}void Work(){ Kruskal();// rep(i,1,n)if(!depth[i])dfs(i); dfs(1); read(q); rep(i,1,q){ read(x,y); if(find(x)!=find(y))printf("%d\n",-1); else printf("%d\n",LCA(x,y)); }}int main(){// freopen("truck.in","r",stdin);// freopen("truck.out","w",stdout); Init(); Work(); fclose(stdin);fclose(stdout); return 0;}

转载于:https://www.cnblogs.com/hankeke/p/Noip2013-truck.html

你可能感兴趣的文章
windows搭建SVN服务MD版
查看>>
Java私塾的一些基础练习题(一)
查看>>
Shell 07 项目案例
查看>>
Dapper基础用法
查看>>
一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(1)--创建和使用可重用工作流...
查看>>
Eclipse配置默认的编码集为utf-8
查看>>
【精解】EOS标准货币体系与源码实现分析
查看>>
HashMap
查看>>
Android广播机制概述
查看>>
[javascript]9宫格拖拽拼图游戏 puzzle
查看>>
Entity Framework底层操作封装(3)
查看>>
InputStream 转换 InputStreamReader再转换BufferedReader
查看>>
在线程池中的使用spring aop事务增强
查看>>
继续深入了解Cookie 和 Session
查看>>
再看《操作系统》--处理机管理
查看>>
亚马逊的负载均衡(Amazon Load Balancing)
查看>>
Java学习之Comparable与Comparator的区别
查看>>
ASP:Checkbox验证非空的一种方法
查看>>
[CQOI2013]新Nim游戏 线性基
查看>>
我的成就故事
查看>>