约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道。因此他决心找一条更合理的赛道。此题的输入于第一题相同,紧接着下一行输入一个整数K,以后K行为K个"距离问题"。每个距离问题包括两个整数,就是约翰感兴趣的两个农场的编号,请你尽快算出这两地之间的距离。
N个点,N-1条边
标签:基本 解决 put student out 结构 ras head 简单
约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道。因此他决心找一条更合理的赛道。此题的输入于第一题相同,紧接着下一行输入一个整数K,以后K行为K个"距离问题"。每个距离问题包括两个整数,就是约翰感兴趣的两个农场的编号,请你尽快算出这两地之间的距离。
N个点,N-1条边
第1..K行:对应每个问题,输出单独的一个整数给出正确的距离。
vector<student>::iterator j; for(j=q[root].begin();j!=q[root].end();j++) { cout<<*j<<endl; }
6.使用下标访问元素
int end=mem.size(); for(i=0;i<end;i++) { cout<<mem[i]<<endl; }
好了,说了这么多,终于可以上代码了,以下是AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<ctime> #include<queue> #include<stack> #include<vector> using namespace std; const int N=40001; const int M=10001; int n,m,l; struct node { int next,to,dis; }edge[2*N]; int head[N],size,vis[N],ans[M],dis[N],father[N]; struct student { int x,id; }; vector<student>q[N]; void putin(int from,int to,int dis) { size++; edge[size].next=head[from]; edge[size].to=to; edge[size].dis=dis; head[from]=size; } int find(int x) { if(father[x]==x)return x; else { father[x]=find(father[x]); return father[x]; } } void dfs(int root) { vis[root]=1; vector<student>::iterator j; for(j=q[root].begin();j!=q[root].end();j++) { int y=j->x; if(vis[y]) { int p=j->id; int lca=find(y); ans[p]=dis[root]+dis[y]-2*dis[lca]; } } for(int i=head[root];i;i=edge[i].next) { int y=edge[i].to; if(!vis[y]) { dis[y]=dis[root]+edge[i].dis; dfs(y); father[y]=root; } } } int main() { int i,j,from,to,dis; char s[2]; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d%s",&from,&to,&dis,s); putin(from,to,dis);putin(to,from,dis); } scanf("%d",&l); for(i=1;i<=l;i++) { scanf("%d%d",&from,&to); q[from].push_back((student){to,i}); q[to].push_back((student){from,i}); } for(i=1;i<=n;i++)father[i]=i; dfs(1); for(i=1;i<=l;i++) { printf("%d\n",ans[i]); } return 0; }
【LCA求最近公共祖先+vector构图】Distance Queries
标签:基本 解决 put student out 结构 ras head 简单
原文地址:http://www.cnblogs.com/huangdalaofighting/p/6817139.html