NOIP2013 货车运输
2015-06-13 22:00
357 查看
题目:http://www.luogu.org/problem/show?pid=1967
分析:kruskal+LCA,注意LCA预处理的两个循环顺序别反了啊,卧槽在这个地方可是下了血本了!
代码:
分析:kruskal+LCA,注意LCA预处理的两个循环顺序别反了啊,卧槽在这个地方可是下了血本了!
代码:
#include <cstdio> #include <algorithm> #include <vector> using namespace std; const int Tmax=10010,Tmax2=50005,inf=0x7fffffff; struct Edge{ int from,to,cost; bool operator <(const Edge &rhs)const { return cost>rhs.cost; } }; Edge E[Tmax2]; vector <int> G[Tmax]; int n,m,f[Tmax],F[Tmax][20],Fmin[Tmax][20],Deep[Tmax]; bool v[Tmax]; int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } void lca(int a,int b) { if(find(a)!=find(b)) { printf("-1\n"); return; } int i,ans=inf,t; if(Deep[a]<Deep[b]) swap(a,b); t=Deep[a]-Deep[b]; for(i=0;i<=16;i++) if(((1<<i)&t)>0){ ans=min(ans,Fmin[a][i]); a=F[a][i]; } for(i=16;i>=0;i--) { if(F[a][i]==F[b][i]) continue; ans=min(ans,Fmin[a][i]); ans=min(ans,Fmin[b][i]); a=F[a][i]; b=F[b][i]; } if(a==b) printf("%d\n",ans); else { ans=min(ans,Fmin[a][0]); ans=min(ans,Fmin[b][0]); printf("%d\n",ans); } return; } void dfs(int x) { v[x]=true; int i,chid,len=G[x].size(); for(i=0;i<len;i++) { chid=E[G[x][i]].from==x?E[G[x][i]].to:E[G[x][i]].from; if(v[chid]==false){ Deep[chid]=Deep[x]+1; F[chid][0]=x; Fmin[chid][0]=E[G[x][i]].cost; dfs(chid); } } return; } void init() { int i,j; for(i=0;i<=n;i++) for(j=0;j<=17;j++) Fmin[i][j]=inf; for(i=1;i<=n;i++) if(v[i]==false) dfs(i); for(j=1;j<=16;j++) for(i=1;i<=n;i++) { if(F[F[i][j-1]][j-1]==0) continue; F[i][j]=F[F[i][j-1]][j-1]; Fmin[i][j]=min(Fmin[i][j-1],Fmin[F[i][j-1]][j-1]); } return; } void kruskal() { int i,tot=0,fa,fb; sort(E+1,E+1+m); for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=m;i++) { if(tot==n-1) break; fa=find(E[i].from);fb=find(E[i].to); if(fa==fb) continue; f[fa]=fb; tot++; G[E[i].from].push_back(i); G[E[i].to].push_back(i); } return; } int main() { int i,q,a,b; scanf("%d %d",&n,&m); for(i=1;i<=m;i++) scanf("%d %d %d",&E[i].from,&E[i].to,&E[i].cost); kruskal(); init(); scanf("%d",&q); for(i=1;i<=q;i++) { scanf("%d %d",&a,&b); lca(a,b); } return 0; }
相关文章推荐
- jsp——学习篇:简单使用CSS
- Geany的"跳转到标记定义“功能如何使用
- CF#306(Div. 2) E-Brackets in Implications
- 一、SpringMvc基础
- 面向对象程序设计
- ios开发 数据存储
- 第三章 选择结构(一)
- 第52章、Bitmap图像处理(从零开始学Android)
- 如何利用PC机搭建综合实验环境之Vmware workstation篇
- NOIP2013 花匠
- Mac OS X Git安装教程
- XJOI NOI2015训练题7 题解
- NOIP2013 火柴排队
- 线段树模板题
- Cpp Primer<<学习IO标准库--文件模式、字符串流_7
- 冯诺依曼体系结构与哈弗体系结构的区别
- echo1(Pwnable.kr)
- LeetCode之“动态规划”:Unique Binary Search Trees && Unique Binary Search Trees II
- ol3简介
- zsh的简单使用