0
点赞
收藏
分享

微信扫一扫

Mahmoud and a Dictionary CodeForces - 766D


将一点拆为两点 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];
}
}

 

用种类并查集就是裸题

#include <cstdio>
#include <iostream>
#include <map>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;

map <string,int> mp;
int f[maxn],dis[maxn];
int n,m,q;

int getf(int p)
{
int res;
if(f[p]==p) return p;
res=getf(f[p]);
dis[p]=(dis[p]+dis[f[p]])%2;
f[p]=res;
return res;
}

bool unite(int u,int v,int val)
{
int fu,fv;
fu=getf(u),fv=getf(v);
if(fu!=fv){
f[fv]=fu;
dis[fv]=(dis[u]+dis[v]+val)%2;
return 1;
}
else{
if((dis[u]+dis[v])%2==val) return 1;
else return 0;
}
}

int solve(int u,int v)
{
int fu,fv;
fu=getf(u),fv=getf(v);
if(fu==fv){
if(dis[u]==dis[v]) return 0;
else return 1;
}
else return 2;
}

int main()
{
string s1,s2;
int i,val,fu,fv;
scanf("%d%d%d",&n,&m,&q);
for(i=1;i<=n;i++){
cin>>s1;
mp[s1]=i;
}
for(i=1;i<=n;i++){
f[i]=i,dis[i]=0;
}
while(m--){
cin>>val>>s1>>s2;
if(unite(mp[s1],mp[s2],val-1)) printf("YES\n");
else printf("NO\n");
}
while(q--){
cin>>s1>>s2;
printf("%d\n",solve(mp[s1],mp[s2])+1);
}

return 0;
}

 


举报

相关推荐

0 条评论