题意:给出一个n个点,m条边的图,先求以1为源的最短路,生成最短路生成树,并且要求树上1到每个点的最短路在原图中是字典序最小的。然后,求这棵树上有多少个点数为K的最长链。
思路:出题人硬是把两个题合成一道题,估计觉得太裸了么。。。。不过这两个一合起来写着还是挺蛋疼的,第一个就是裸的最短路,求出最短路后搜一下就好了。至于第二个问题,利用树上的分治算法可以解决,对于当前的子树,维护到根的点数为x的最大长度和数量就行了。
代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL;
using namespace std;
typedef long long ll;
const int maxn=30000+10;
const int maxm=60000+10;
struct Edge
{
int v,