本人水平有限,只写出来了一个暴力解能拿到一半的分数
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e4 + 10;
typedef pair<int, int>PII;
int n, k;
int ans;
int s[N];
//采用动态数组来建图,g[x],x是父节点,g[x]里存储和他相邻的节点
vector<PII>g[N];
map<PII, int>mp;//建立一个映射,也就是函数 PII像当与自变量x,int是因变量y
int dfs(int u,int x,int father,int v,int s1)//u起点,x是当前节点,v是终点,q1是当前节点的父节点,s是记数变量,当前走了多少
{
if (x == v)
{
mp[{u,v}] = s1;//将得到的距离存在map映射里
mp[{v, u}] = s1;//双向标记,因为要访问的节点是没有顺序的
return 1;
}
for (int i = 0; i < g[x].size(); i++)
{
int son = g[x][i].first;//访问和他相邻的节点
if (son == father)
{
continue;//,防止死循环
}
int w = g[x][i].second;
if (dfs(u, son, x, v, s1 + w))return 1;
}
return 0;
}
void solve()
{
for (int i &