题目大意:n个房子,m次询问。接下来给出n-1行数据,每行数据有u,v,w三个数,代表u到v的距离为w(双向),值得注意的是所修建的道路不会经过一座房子超过一次。m次询问,每次询问给出u,v求u,v之间的最短路。
题目思路:开始以为是最短路,但仔细分析后发现无论是SPFA还是其他最短路算法时间都会超限。因为所修的路不会经过一座房子两次,所以想到了DFS搜一下,这样时间复杂度为O(N),用邻接矩阵存图会爆内存,所以用邻接表存图。
#include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #define INF 0x3f3f3f3f #define MAX 1000005 using namespace std; struct node { int u,v,w,next; } Map[MAX]; int n,m,k,a[MAX],s,e,vis[MAX],dist,ok; void Add(int u,int v,int w) { Map[k].u=u; Map[k].v=v; Map[k].w=w; Map[k].next=a[u]; a[u]=k++; } void DFS(int step,int ans) { if(step==e && !ok) { ok=1; dist=ans; return; } for(int i=a[step]; i!=-1; i=Map[i].next) { int v=Map[i].v; if(!vis[v]) { vis[v]=1; DFS(v,ans+Map[i].w); } if(ok) return; } } int main() { int T,i,j,u,v,w; scanf("%d",&T); while(T--) { for(i=0;i<MAX;i++) a[i]=-1; k=0; scanf("%d%d",&n,&m); for(i=1; i<n; i++) { scanf("%d%d%d",&u,&v,&w); Add(u,v,w); Add(v,u,w); } for(i=1; i<=m; i++) { ok=0; memset(vis,0,sizeof(vis)); scanf("%d%d",&u,&v); vis[u]=1; s=u; e=v; DFS(u,0); printf("%d ",dist); } } return 0; }