NOIP2013提高组 货车运输
2016-07-15 10:37
423 查看
这道题其实和邦德市一样,只是需要多判断一下是不是在同一棵树上,这里我是用vis来标记的连通分量实现的。详见http://blog.csdn.net/qq_35546274/article/details/51888979
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int maxn=50005; struct lu { int u,v,w; }; vector<lu>g; vector<int>ww[maxn],e[maxn]; int n,m,q,pa[maxn],fa[maxn],dist[maxn],dep[maxn],vis[maxn]={0}; bool my(lu a,lu b) { return a.w>b.w; } void init() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); g.push_back((lu){x,y,z}); } sort(g.begin(),g.end(),my); } void in() { for(int i=1;i<=n;i++) pa[i]=i; } int find(int x) { if(pa[x]==x) return x; pa[x]=find(pa[x]); return pa[x]; } void krscr() { for(int i=0;i<g.size();i++) { int x=g[i].u,y=g[i].v,z=g[i].w; if(find(x)==find(y)) continue; pa[find(x)]=find(y); e[x].push_back(y); e[y].push_back(x); ww[x].push_back(z); ww[y].push_back(z); } } int f(int x,int y) { int k=200000; if(dep[x]<dep[y]) swap(x,y); while(dep[x]>dep[y]) { k=min(k,dist[x]-dist[fa[x]]); x=fa[x]; } while(x!=y) { k=min(k,dist[x]-dist[fa[x]]); k=min(k,dist[y]-dist[fa[y]]); y=fa[y]; x=fa[x]; } return k; } void dfs(int x,int y) { vis[x]=y; for(int i=0;i<e[x].size();i++) { int j=e[x][i]; if(vis[j]) continue; dep[j]=dep[x]+1; fa[j]=x; dist[j]=dist[x]+ww[x][i]; dfs(j,y); } } int main() { freopen("bus.in","r",stdin); //freopen("bus.out","w",stdout); init(); in(); krscr(); int t=0; for(int i=1;i<=n;i++) if(vis[i]==0) { fa[i]=i; dep[i]=1; dist[i]=0; dfs(i,++t); } scanf("%d",&q); for(int i=1;i<=q;i++) { int x,y; scanf("%d%d",&x,&y); if(vis[x]!=vis[y]) { printf("-1\n"); continue; } int ans=f(x,y); printf("%d\n",ans); } return 0; }
相关文章推荐
- Android 屏蔽和捕获Home键的示例代码
- 16.7.15
- Android自动文本框输入识别提示功能代码
- C语言提高总结
- 【Proto文件】Google开源技术 Protobuf 简介与使用
- java入门第一季_1.4_java中的常用标识符
- 使用TCP/IP的套接字(Socket)进行通信
- 多线程任务Callable与Future或FutureTask的使用
- ArcGIS空间参考
- java学习笔记八:static关键字
- 一个sample学会使用epoll
- java解析任意层的json数据(递归解析)
- java中添加按钮并添加响应事件
- BaseService --- service层的抽取
- 5. Longest Palindromic Substring
- poj 3040 Allowance
- EasyUI常用组件(基础)
- Exception in thread “main” java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop
- has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here
- EasyUI常用组件(基础)