求助 60 分
查看原帖
求助 60 分
363006
wangyibo201026楼主2021/12/28 21:27

总感觉自己哪里写错了,但就是找不到:

#include<bits/stdc++.h>
#define int long long

using namespace std;

int t, n, m, f[2][100005], mini = 1e9;
int scc[100005], cnt;
vector<int> e[100005], p[3];
bool vis[100005];

void dfs(int x){
  if(vis[x]){
    return ;
  }
  scc[x] = cnt;
  vis[x] = true;;
  for(int i = 0; i < e[x].size(); i++){
    dfs(e[x][i]);
  }
}

void Sol(int g){
  sort(p[g].begin(), p[g].end());
  for(int i = 1; i <= n; i++){
    int x  = lower_bound(p[g].begin(), p[g].end(), i) - p[g].begin();
    if(x < p[g].size()){
      f[g][scc[i]] = min(f[g][scc[i]], abs(p[g][x] - i) * abs(p[g][x] - i));
    }
    if(x > 0){
      f[g][scc[i]] = min(f[g][scc[i]], abs(p[g][x - 1] - i) * abs(p[g][x - 1] - i));
    }
  }
}

void Solve(){
  cin >> t;
  while(t--){
    memset(vis, 0, sizeof(vis));
    memset(f, 0x7f, sizeof(f));
    memset(scc, 0, sizeof(scc));
    p[0].clear();
    p[1].clear();
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
      e[i].clear();
    }
    cnt = 0;
    mini = LLONG_MAX;
    for(int i = 1; i <= m; i++){
      int u, v;
      cin >> u >> v;
      e[u].push_back(v);
      e[v].push_back(u);
    }
    for(int i = 1; i <= n; i++){
      if(!vis[i]){
        cnt++;
        dfs(i);
      }
    } 
    for(int i = 1; i <= n; i++){
      if(scc[i] == scc[1]){
        p[0].push_back(i);
      }
      else if(scc[i] == scc[n]){
        p[1].push_back(i);
      }
    }
    Sol(0);
    Sol(1);
    for(int i = 1; i <= cnt; i++){
      mini = min(mini, f[0][i] + f[1][i]);
    }
    cout << mini << endl;
  }
}

signed main(){
  Solve();
  return 0;
}
2021/12/28 21:27
加载中...