C

来源:互联网 发布:优酷怎么在mac下缓存 编辑:程序博客网 时间:2024/06/18 15:35
//#include<bits/stdc++.h>//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h>#include<algorithm>#include<queue>#include<string.h>#include<iostream>#include<math.h>#include<set>#include<map>#include<vector>#include<iomanip>using namespace std;#define ll long long#define pb push_backconst int maxn=4e4+9;int cnt;struct EDGE{int v;int d;};vector<EDGE>G[maxn];int vs[maxn*2-1];//每次访问到的节点int dep[maxn*2-1];//节点深度int id[maxn];//编号节点第一次访问的时间void init(int n){for(int i=1;i<=n;i++)G[i].clear();cnt=0;}void addedge(int u,int v,int d){G[u].pb((EDGE){v,d});G[v].pb((EDGE){u,d});}void dfs(int u,int fa,int d){id[u]=++cnt;vs[cnt]=u;dep[cnt]=d;int sz=G[u].size();for(int i=0;i<sz;i++){EDGE &e=G[u][i];if(e.v==fa)continue;dfs(e.v,u,d+e.d);vs[++cnt]=u;dep[cnt]=d;}}int dp[maxn<<1][20];void init_rmq(int n,int dep[]){for(int i=1;i<=n;i++)dp[i][0]=i;for(int j=1;(1<<j)<=n;j++){for(int i=1;i+(1<<j)-1<=n;i++){int a=dp[i][j-1],b=dp[i+(1<<(j-1))][j-1];dp[i][j]=dep[a]<dep[b]?a:b;}}}int rmq(int l,int r){if(l>r)swap(l,r);int ph=0;while((1<<(ph+1)) <= r-l+1)ph++;return dep[dp[l][ph]]<=dep[dp[r-(1<<ph)+1][ph]]?dp[l][ph]:dp[r-(1<<ph)+1][ph];}int lca(int u,int v){return vs[rmq(id[u],id[v])];}/*******************************************************************************************************************/int fa[maxn];void ufs_init(int n){for(int i=0;i<=n;i++)fa[i]=i;}int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}void unite(int x,int y){int a=find(x),b=find(y);if(a!=b)fa[a]=b;}int main(){int n,m,c;while(scanf("%d%d%d",&n,&m,&c)!=EOF){//城市数,边数,查询数for(int i=0;i<=n;i++)G[i].clear();cnt=0;int u,v,d;ufs_init(n);for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&d);unite(u,v);addedge(u,v,d);}for(int i=1;i<=n;i++){if(find(i)==i){dfs(i,-1,0);}}init_rmq(2*n-1,dep);for(int i=1;i<=c;i++){scanf("%d%d",&u,&v);if(find(u)!=find(v)){printf("Not connected\n");}else{printf("%d\n",dep[id[u]]+dep[id[v]]-2*dep[id[lca(u,v)]]);}}}}
这次的板子应该没问题了。。。。。。
原创粉丝点击