题解:P16565 [ICPC 2026 APC] Extra Transition
题意
一个无向图如果满足以下条件则是好的:对于每个
思路
条件一等价于把
所以好图等价于以
对于第二问,如果是串联,那么可以连,每条边维护一个
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> PII;
const int N=2e5+10;
int w[N],vis[N],ans;
map<int,int> mp[N];
signed main()
{
// freopen("transfer.in","r",stdin);
// freopen("transfer.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--)
{
int n,m,fg=1;
cin>>n>>m;
ans=0;
for(int i=1;i<=n;i++)
cin>>w[i],mp[i].clear(),vis[i]=0;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
mp[u][v]=mp[v][u]=0;
}
queue<int> q;
for(int i=2;i<n;i++)
if(mp[i].size()==2) q.push(i);
while(!q.empty())
{
int u=q.front();
q.pop();
if(vis[u]||mp[u].size()!=2) continue;
vis[u]=1;
PII p1=*mp[u].begin(),p2=*next(mp[u].begin());
int x=p1.first,sx=p1.second,y=p2.first,sy=p2.second;
mp[u].clear(),mp[x].erase(u),mp[y].erase(u);
ans+=sx*sy+w[x]*sy+w[y]*sx;
if(mp[x].count(y)) mp[x][y]=mp[y][x]=0;
else ans+=w[x]*w[y],mp[x][y]=mp[y][x]=sx+sy+w[u];
if(x!=1&&x!=n&&mp[x].size()==2) q.push(x);
if(y!=1&&y!=n&&mp[y].size()==2) q.push(y);
}
if(mp[1].size()!=1||mp[1].begin()->first!=n) fg=0;
for(int i=2;i<n;i++)
if(!vis[i]) fg=0;
if(!fg) cout<<"bad\n";
else cout<<ans<<'\n';
}
return 0;
}