我们枚举一个中心点,称为X
将与中心点相连的点取出来,这个点集称为S
剩下的点按照联通块分成若干个点集,设第i个联通块构成的点集为Ti
找出S中与Ti中任意一点相邻的所有点,这个点集称为Gi
如果Gi中存在两个不相邻的点,那么原图一定有解
这个解是:中心点,Gi中不相邻的两个点,以及与这两个点相邻的Ti中的两个点的最短路径上的所有点,最短路径上的点是不会有不满足题意的情况的
这样总复杂度O(nm)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;
const int MOD=1e9+7;
c