对于vector容器中,存储的是int类型,但若不开long long 就ER

牛客暑期训练1 F dfs鸡玩炸弹人

#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;
}
posted on 2023-01-29 12:06  rain_wind_read  阅读(37)  评论(0编辑  收藏  举报