Cod sursa(job #700251)

Utilizator amerigohi lili amerigo Data 1 martie 2012 08:37:05
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#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;
}