/*
ID: 1436
Name: Is it a tree?
*/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
struct Edge
{
int d;
int s;
};
struct Graph
{
int N;
int M;
struct Edge* edge;
};
struct Graph* createGraph(int N, int M)
{
struct Graph
* g
= (struct Graph
*) malloc(sizeof(struct Graph
)); g -> M = M;
g -> N = N;
g
-> edge
= (struct Edge
*) malloc (sizeof(struct Edge
));
return g;
}
int findP(int p[], int v)
{
if (p[v] == -1)
return v;
return findP(p, p[v]);
}
void Union(int p[], int x, int y)
{
int xS = findP(p, x);
int yS = findP(p, y);
p[xS] = yS;
}
int cycle(struct Graph* g)
{
int *par
= (int*) malloc(((g
-> N
)+1) * sizeof(int)); memset(par
, -1, ((g
-> N
)+1) * sizeof(int));
for (int i=0; i<g -> M; i++) {
int x = findP(par, g->edge[i].s);
int y = findP(par, g->edge[i].d);
if (x == y)
return 1;
Union(par, x, y);
}
return 0;
}
int main ()
{
int N, M;
struct Graph* g = createGraph(N, M);
for (int i=0; i<M; i++) {
int a, b;
if (a != b) {
g -> edge[i].s = a;
g -> edge[i].d = b;
}
}
if (M != N-1) {
return 0;
}
if (cycle(g))
else
}
LyoKSUQ6IDE0MzYKTmFtZTogSXMgaXQgYSB0cmVlPwoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKc3RydWN0IEVkZ2UKewoJaW50IGQ7CglpbnQgczsKfTsKc3RydWN0IEdyYXBoCnsKCWludCBOOwoJaW50IE07CglzdHJ1Y3QgRWRnZSogZWRnZTsKfTsKCnN0cnVjdCBHcmFwaCogY3JlYXRlR3JhcGgoaW50IE4sIGludCBNKQp7CglzdHJ1Y3QgR3JhcGgqIGcgPSAoc3RydWN0IEdyYXBoKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgR3JhcGgpKTsKCWcgLT4gTSA9IE07CglnIC0+IE4gPSBOOwoJZyAtPiBlZGdlID0gKHN0cnVjdCBFZGdlKikgbWFsbG9jIChzaXplb2Yoc3RydWN0IEVkZ2UpKTsKCglyZXR1cm4gZzsKfQppbnQgZmluZFAoaW50IHBbXSwgaW50IHYpCnsKCWlmIChwW3ZdID09IC0xKQoJCXJldHVybiB2OwoJcmV0dXJuIGZpbmRQKHAsIHBbdl0pOwp9CnZvaWQgVW5pb24oaW50IHBbXSwgaW50IHgsIGludCB5KSAKewoJaW50IHhTID0gZmluZFAocCwgeCk7CglpbnQgeVMgPSBmaW5kUChwLCB5KTsKCglwW3hTXSA9IHlTOwp9CmludCBjeWNsZShzdHJ1Y3QgR3JhcGgqIGcpCnsJCglpbnQgKnBhciA9IChpbnQqKSBtYWxsb2MoKChnIC0+IE4pKzEpICogc2l6ZW9mKGludCkpOwoJbWVtc2V0KHBhciwgLTEsICgoZyAtPiBOKSsxKSAqIHNpemVvZihpbnQpKTsKCglmb3IgKGludCBpPTA7IGk8ZyAtPiBNOyBpKyspIHsKCQlpbnQgeCA9IGZpbmRQKHBhciwgZy0+ZWRnZVtpXS5zKTsKCQlpbnQgeSA9IGZpbmRQKHBhciwgZy0+ZWRnZVtpXS5kKTsKCQkKCQlpZiAoeCA9PSB5KQoJCQlyZXR1cm4gMTsKCQlVbmlvbihwYXIsIHgsIHkpOwoJfQoJcmV0dXJuIDA7Cn0KaW50IG1haW4gKCkKewoJaW50IE4sIE07CglzY2FuZigiJWQgJWQiLCAmTiwgJk0pOwoKCXN0cnVjdCBHcmFwaCogZyA9IGNyZWF0ZUdyYXBoKE4sIE0pOwoKCWZvciAoaW50IGk9MDsgaTxNOyBpKyspIHsKCQlpbnQgYSwgYjsKCQlzY2FuZigiJWQgJWQiLCAmYSwgJmIpOwoKCQlpZiAoYSAhPSBiKSB7CgkJCWcgLT4gZWRnZVtpXS5zID0gYTsKCQkJZyAtPiBlZGdlW2ldLmQgPSBiOwkJIAoJCX0KCX0KCWlmIChNICE9IE4tMSkgewoJCXByaW50ZigiTk9cbiIpOwoJCXJldHVybiAwOwoJfQoJaWYgKGN5Y2xlKGcpKQoJCXByaW50ZigiTk9cbiIpOwoJZWxzZQoJCXByaW50ZigiWUVTXG4iKTsKfQ==