80pts求助
查看原帖
80pts求助
964091
封禁用户楼主2024/10/21 13:26
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
int t,n,m,u,v,zuo[200005],you[200005],id[200005],vis[200005],cnt,bigRex;
vector<int>ve[200005],ve2[200005];
void dfs(int x)
{
	zuo[x] = you[x] = x,vis[x] = 1;
	id[x] = cnt;
	for(int i = 0;i < ve[x].size();i ++)
		if(!vis[ve[x][i]])
		{
			vis[ve[x][i]] = 1;
			dfs(ve[x][i]);
			zuo[x] = min(zuo[x],zuo[ve[x][i]]);
			you[x] = max(you[x],you[ve[x][i]]);
		}
}
int Minn(int x,int y,int z)
{
	return min((z - y) * (z - y),(z - x) * (z - x));
}
signed main()
{
	cin >> t;
	vector<int>::iterator kk,kk2;
	while(t --)
	{
		cin >> n >> m;
		int zhen = 1e12;
		cnt = 0;
		for(int i = 1;i <= n;i ++)
			ve[i].clear(),ve2[i].clear(),vis[i] = id[i] = zuo[i] = you[i] = 0;
		for(int i = 1;i <= m;i ++)
		{
			cin >> u >> v;
			ve[u].push_back(v),ve[v].push_back(u);
		}
		for(int i = 1;i <= n;i ++)
			if(!vis[i])cnt ++,dfs(i);
		if(you[1] == n)
		{
			cout << "0\n";
			continue ;
		}
		for(int i = 1;i <= n;i ++)
		{
			ve2[id[i]].push_back(i);
			if(i == n)bigRex = id[i];
		}
 		for(int i = 1;i <= cnt;i ++)
		{
			int ans = 1e12,ans2 = 1e12;
			for(int j = 0;j < ve2[i].size();j ++)
			{
				int q = ve2[i][j];
				kk = lower_bound(ve2[1].begin(),ve2[1].end(),q),kk2 = upper_bound(ve2[1].begin(),ve2[1].end(),q);
				int kl = distance(ve2[1].begin(),kk),kl2 = distance(ve2[1].begin(),kk2);
				if(kl >= ve2[1].size())kl --;
				if(kl2 >= ve2[1].size())kl2 --;
				ans = min(ans,Minn(ve2[1][kl],ve2[1][kl2],q));
			}
			for(int j = 0;j < ve2[i].size();j ++)
			{
				int q = ve2[i][j];
				kk = lower_bound(ve2[bigRex].begin(),ve2[bigRex].end(),q),kk2 = upper_bound(ve2[bigRex].begin(),ve2[bigRex].end(),q);
				int kl = distance(ve2[bigRex].begin(),kk),kl2 = distance(ve2[bigRex].begin(),kk2);
				if(kl >= ve2[bigRex].size())kl --;
				if(kl2 >= ve2[bigRex].size())kl2 --;
				ans2 = min(ans2,Minn(ve2[bigRex][kl],ve2[bigRex][kl2],q));
			}
			zhen = min(zhen,ans + ans2);
		
		cout << zhen << '\n';
	}
}
2024/10/21 13:26
加载中...