链接:
题意:前一阵子做的,题意忘记了,大体就是求树的直径,就是树的最长路的长度。
思路:树的直径有这么一个算法,从树上任意一点出发,找一条最长路,终点为A,再从A点出来,找一条最长路,终点为B,那么树的直径就是AB的长度。求最长路可用dfs或者spfa来写。
#include#include #include #include #include using namespace std;const int maxn=100000+5;const int INF=0x3f3f3f3f;//不能随便写,不然后面的memset出错int n,m;vector list[maxn];queue q;int dis[maxn];int inq[maxn];void spfa(int p){ int u; memset(dis,0x3f,sizeof(dis)); memset(inq,0,sizeof(inq));//for(int i=0;i<=n;i++)//{// dis[i]=INF;// inq[i]=0;//} dis[p]=0;inq[p]++; q.push(p); while(!q.empty()) { u=q.front(); q.pop();inq[u]--;//因为某个点可能重复入队,所以出队的时候也要标记,和bfs不同,bfs只用入队标记,因为只入队一次 for(int i=0;i dis[p]) p=i; spfa(p); for(int i=2;i<=n;i++) if(dis[i]>dis[p]) p=i; p=dis[p];// while(m--) { scanf("%d",&k); if(k<=p+1) printf("%d\n",k-1); else printf("%d\n",(k-p-1)*2+p); } } return 0;}