30pts,求助
查看原帖
30pts,求助
389955
WillW_Chen楼主2022/12/1 00:45
#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstring>
#include<string>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<vector>
#include<bitset>
#include<list>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<ctime>
#include<random>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll MAXN=5*1e6+5;
const ll inf=0x3f3f3f3f;
ll n,m,t;
ll fa[MAXN];
vector<ll>a;
vector<ll>b;
vector<ll>c;
vector<ll>a2;
vector<ll>b2;
vector<ll>c2;
ll ans;
int find(int x){
    if(fa[x]==x){
        return x;
    }
    else{
        return fa[x]=find(fa[x]);
    }
}
void merge(int x,int y){
    int fx=find(x);
    int fy=find(y);
    if(fx==fy){
        return;
    }
    fa[fx]=fy;
    return;
}
void init(){
    a.clear();
    b.clear();
    c.clear();
    a2.clear();
    b2.clear();
    c2.clear();
    ans=0x3f3f3f3f3f3f3f3f;
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
    return;
}
bool cmp(int a,int b){
    return a>b;
}
void solve(){
    for(int i=0;i<a.size();i++){
        int ind1=lower_bound(c.begin(),c.end(),a[i])-c.begin();
        int ind2=lower_bound(c2.begin(),c2.end(),a[i],greater<int>())-c2.begin();
        ll num1=(ind1==c.size()?inf:abs(a[i]-c[ind1]));
        ll num2=(ind2==c2.size()?inf:abs(a[i]-c2[ind2]));
        if(num1*num1<=num2*num2){
            ans=min(ans,num1*num1);
        }
        else{
            ans=min(ans,num2*num2);
        }
    }
    for(int i=0;i<b.size();i++){
        int inda1=lower_bound(a.begin(),a.end(),b[i])-a.begin();
        int inda2=lower_bound(a2.begin(),a2.end(),b[i],greater<int>())-a2.begin();
        int indc1=lower_bound(c.begin(),c.end(),b[i])-c.begin();
        int indc2=lower_bound(c2.begin(),c2.end(),b[i],greater<int>())-c2.begin();
        ll numa1=(inda1==a.size()?inf:abs(b[i]-a[inda1]));
        ll numa2=(inda2==a2.size()?inf:abs(b[i]-a2[inda2]));
        ll numc1=(indc1==c.size()?inf:abs(b[i]-c[indc1]));
        ll numc2=(indc2==c2.size()?inf:abs(b[i]-c2[indc2]));
        if(numa1*numa1<=numa2*numa2){
            if(numc1*numc1<=numc2*numc2){
                ans=min(ans,numa1*numa1+numc1*numc1);
            }
            else{
                ans=min(ans,numa1*numa1+numc2*numc2);
            }
        }
        else{
            if(numc1*numc1<=numc2*numc2){
                ans=min(ans,numa2*numa2+numc1*numc1);
            }
            else{
                ans=min(ans,numa2*numa2+numc2*numc2);
            }
        }
    }
    return;
}
int main(){
    cin>>t;
    while(t--){
        cin>>n>>m;
        init();
        for(int i=1;i<=m;i++){
            int u,v;
            cin>>u>>v;
            merge(u,v);
        }
        if(find(1)==find(n)){
            cout<<0<<endl;
            continue;
        }
        for(int i=1;i<=n;i++){
            if(find(i)==find(1)){
                a.push_back(i);
                a2.push_back(i);
            }
            else if(find(i)==find(n)){
                c.push_back(i);
                c2.push_back(i);
            }
            else{
                b.push_back(i);
            }
        }
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        sort(c.begin(),c.end());
        sort(a2.begin(),a2.end(),cmp);
        sort(c2.begin(),c2.end(),cmp);
        solve();
        cout<<ans<<endl;
    }
    return 0;
}
2022/12/1 00:45
加载中...