Problem Link: http://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();
}
}
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