您的位置:首页 > 其它

Mahmoud and a Dictionary CodeForces - 766D

2017-10-31 11:43 369 查看
点击打开链接

将一点拆为两点 a与a'

如果说a与b为朋友

先判断 a和b‘(或a’与b)是不是在同一集合 是的话就错 不是的话就将 a与b a'与b' 合并

如果说a与b为敌人也是一个道理

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

map <string,int> mp;
int f[200010];
int n,m,q;
char ch[100010][30];

int getf(int p);

int main()
{
string s;
int i,j,t,u,v;
int fu1,fv1,fu2,fv2;
char ch1[30],ch2[30];
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
mp.clear();
for(i=1;i<=n*2;i++)
{
f[i]=i;
}

for(i=1;i<=n;i++)
{
scanf("%s",ch[i]);
s=(string)(ch[i]);
mp[s]=i;
}

while(m--)
{
scanf("%d%s%s",&t,ch1,ch2);
s=(string)ch1;
u=mp[s];
s=(string)ch2;
v=mp[s];
fu1=getf(u),fv1=getf(v);
fu2=getf(u+n),fv2=getf(v+n);

if(t==1)
{
if(fu1!=fv2)//非敌
{
printf("YES\n");
f[fv1]=fu1;//
f[fv2]=fu2;//
}
else
{
printf("NO\n");
}
}
else
{
if(fu1==fv1)
{
printf("NO\n");
}
else
{
printf("YES\n");
f[fv1]=fu2;
f[fv2]=fu1;
}
}
}

while(q--)
{
scanf("%s%s",ch1,ch2);
s=(string)ch1;
u=mp[s];
s=(string)ch2;
v=mp[s];

fu1=getf(u),fv1=getf(v);
fu2=getf(u+n),fv2=getf(v+n);
if(fu1==fv1)
{
printf("1\n");
}
else if(fu1==fv2)
{
printf("2\n");
}
else
{
printf("3\n");
}
}
}
return 0;
}

int getf(int p)
{
if(f[p]==p) return p;
else
{
f[p]=getf(f[p]);
return f[p];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: