dfs找出所有节点所在树及到树根的距离及深度及父亲。
i和j在一棵树上,则最短路为dis[i]+dis[j]-dis[LCA(i,j)]*2。
#include <cstring> #include <cstdio> #define N 10005 #define add(u,v,w) e[++cnt]=(edge){v,head[u],w};head[u]=cnt using namespace std; struct edge{ int to,next,w; }e[N<<1]; int head[N],cnt,f[N],dis[N],deep[N],tr[N],t; int fa(int i,int j){ while(i!=j) if(deep[i]>deep[j]) i=f[i]; else j=f[j]; return i; } void dfs(int x,int p){ tr[x]=t; deep[x]=deep[p]+1; f[x]=p; for(int i=head[x];i;i=e[i].next){ int v=e[i].to; if(v==p)continue; dis[v]=dis[x]+e[i].w; dfs(v,x); } } int main(){ int n,m,c,u,v,w; while(~scanf("%d%d%d",&n,&m,&c)){ memset(head,0,sizeof head); memset(f,0,sizeof f); cnt=t=0; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } for(int i=1;i<=n;i++) if(f[i]==0){ t++; dfs(i,0); } for(int i=1;i<=c;i++){ scanf("%d%d",&u,&v); if(tr[u]!=tr[v]) puts("Not connected"); else printf("%d\n",dis[u]+dis[v]-dis[fa(u,v)]*2); } } }
时间: 2024-10-12 07:39:26