#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
//计算有炸弹的连通块的数量。在一个连通块内不论炸弹怎样分布,都可以达到目的。
//若数量为0,直接sizi*sizi*sizj*sizj;若为1,输出有炸弹连通块内的siz*siz
vector<int> g[100010];
bool st[100010];
int have_bomb,c[100010];
int n, m,sz;
void dfs(int u)
{
if(c[u])
have_bomb = 1;
st[u] = true;
sz++;
for(auto a:g[u])
if(!st[a]) dfs(a);
}
int main()
{
cin>>n>>m;
int u, v;
for (int i = 0; i < m;i++)
{
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = 1; i <= n;i++) scanf("%d", &c[i]);
int bomb = 0,last_bomb=0;
vector<ll> p_size; //---------------------------------------------------疑问在这里!!!----------------------------------------------------------------------
for (int i = 1; i <= n;i++)
{
if(!st[i])
{
sz=have_bomb = 0;
dfs(i);
bomb += have_bomb;
p_size.push_back(sz);
if(have_bomb) last_bomb = p_size.size()-1;
}
}
if(bomb==0)
{
ll ans=0;
for(auto a:p_size) ans+=(a*a);
printf("%lld", ans);
}
else if(bomb==1) printf("%lld", (ll)p_size[last_bomb] * p_size[last_bomb]);
else printf("%d", 0);
return 0;
}
标签:int,dfs,st,vector,long,100010
From: https://www.cnblogs.com/ccag/p/17072335.html