Tuesday, October 18, 2016

1009 - Back to Underworld

Problem Linkhttp://www.lightoj.com/volume_showproblem.php?problem=1009

Solution :

#include<bits/stdc++.h>

using namespace std;

vector<int>v[200001];
vector<int>node;

int visited[200001],cnt,mnt;

map<int,string>mp;
map<int,string> :: iterator it;

void bfs(int source)
{

    cnt=0,mnt=0;

    queue<int>q;

    q.push(source);

    visited[source]=0;
    cnt++;

    int u,p;

    while(!q.empty())
    {
        u=q.front();

        if(mp[u]=="black" and visited[u]==-1) cnt++;
        else if(mp[u]=="red" and visited[u]==-1) mnt++;

        q.pop();
        for(int i=0; i<v[u].size(); i++)
        {
            p=v[u][i];

            if(visited[p]==-1)
            {
                if(mp[u]=="black") mp[p]="red",mnt++;
                else mp[p]="black",cnt++;

                visited[p]=visited[u]+1;
                q.push(p);
            }

        }
    }
}

int main()
{

    int t,e,a,b,ans;
    scanf("%d",&t);

    for(int ca=1; ca<=t; ca++)
    {
        scanf("%d",&e);

        cnt=0,mnt=0,ans=0;

        for(int i=1; i<=e; i++)
        {


            scanf("%d%d",&a,&b);

            v[a].push_back(b);
            v[b].push_back(a);

            node.push_back(a);
            node.push_back(b);

            mp[a]="black";
            mp[b]="black";
        }
        memset(visited,-1,sizeof(visited));

        for(int i=0; i<node.size(); i++)
        {
            if(visited[node[i]]==-1)
            {
                bfs(node[i]);
                ans=ans+max(cnt,mnt);
            }
        }

        printf("Case %d: %d\n",ca,ans);

        for(int i=0; i<200001; i++) v[i].clear();

        mp.clear();
        node.clear();

    }

}

No comments:

Post a Comment