您的位置:首页 > 其它

nyoj 1022:合纵连横(并查集删点)

2017-02-13 12:51 302 查看
题目链接

参考链接

只附代码好了

#include<bits/stdc++.h>
using namespace std;

const int N=200005;
int a
,b
,vis
;
int n,m,add,kase;

void init()
{
for(int i=0;i<n;i++)
a[i]=i,b[i]=i;
add=n;
memset(vis,0,sizeof(vis));
}
int Find(int x)
{
return x==a[x]? x:a[x]=Find(a[x]);
}
void Unite(int x,int y)    //入口由b
控制
{
x=Find(x),y=Find(y);
a[x]=y;
}
void Remove(int x)
{
a[add]=add,b[x]=add;
add++;
//金蝉脱壳
}
int main()
{
while(cin>>n>>m)
{
init();
while(m--)
{
char op;int x,y;
cin>>op;
if(op=='U')
{
cin>>x>>y;
Unite(b[x],b[y]);
}
else
{
cin>>x;
Remove(x);
}
}
int ans=0;
for(int i=0;i<n;i++)
{
if(!vis[Find(b[i])])
ans++,vis[Find(i)]=1;
}
printf("Case #%d: %d\n",++kase,ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: