Cod sursa(job #700251)
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int x,y,n,m,i,c,ok=1;
struct tlink {int nod; tlink * next;};
struct tlist {tlink *first,*last;};
void addlast(tlist &list,int nod)
{
tlink *l=new tlink;
l->nod=nod;
if(list.first==NULL) {list.first=l;list.last=l;}
list.last->next=l;
list.last=l;
l->next=NULL;
}
struct tnod {int chk,val; tlist list;} a[100001];
void link(int x, int y)
{
addlast(a[x].list,y);
addlast(a[y].list,x);
}
int dfs(int p,int tar)
{
if(a[p].val==tar) return 1;
a[p].chk=ok;
tlink * t=a[p].list.first;
while(t!=NULL)
{
if(a[t->nod].chk!=ok)
if(dfs(t->nod,tar)==1 || x==y)
return 1;
t=t->next;
}
return 0;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
a[i].chk=0;
a[i].val=0;
a[i].list.first=NULL;
}
for(i=1;i<=m;i++)
{
f>>c>>x>>y;
if(c==1)
{
a[x].val=x;
a[y].val=y;
link(x,y);
}
if(c==2)
if(dfs(x,y)==1)
g<<"DA"<<endl;
else
g<<"NU"<<endl;
ok++;
}
g.close();
f.close();
return 0;
}