您的位置:首页 > 其它

hdu_1325_Is It A Tree?(DFS)

2013-04-09 08:21 197 查看
題意:

判斷輸入的數據是否是一棵有向樹

分析:

1.n個節點,n-1條邊

2.從root開始做一次DFS即可,當從root開始做了一次DFS之後還有沒有訪問到的頂點,那麼這就是不符合要求

Code:

#include <set>

#include <map>

#include <cmath>

#include <ctime>

#include <stack>

#include <queue>

#include <deque>

#include <vector>

#include <cstdio>

#include <bitset>

#include <cstdlib>

#include <cstring>

#include <algorithm>

using namespace std;

#define DIR 4

#define DIM 2

#define STATUS 2

#define MAXN 100000 + 10

#define MAXM 100000 + 10

#define oo (~0u)>>1

#define INF 0x3F3F3F3F

#define REPI(i, s, e) for(int i = s; i <= e; i ++)

#define REPD(i, e, s) for(int i = e; i >= s; i --)

static const double EPS = 1e-5;

typedef struct ArcNode_ {

int u, v, w, next;

}ArcNode;

ArcNode arc[MAXM];

int hash[MAXN], visit[MAXN], head[MAXN], in[MAXN], cnt;

inline void insert_arc(int u, int v)

{

arc[cnt].v = v;

arc[cnt].next = head[u], head[u] = cnt ++;

}

inline void dfs(int u)

{

visit[u] = 1;

for(int i = head[u]; -1 != i; i = arc[i].next) {

int v = arc[i].v;

if( visit[v] ) {

continue;

}

dfs(v);

}

}

int judge(int arc, int node, int max_idx)

{

if( !arc ) {

return 1;

}

if( arc != node-1 ) {

return 0;

}

int root;

REPI(i, 1, max_idx) {

if( hash[i] && !in[i] ) {

root = i;

break;

}

}

dfs(root);

REPI(i, 1, max_idx) {

if( hash[i] && !visit[i] ) {

return 0;

}

}

return 1;

}

int main(int argc, char const *argv[])

{

#ifndef ONLINE_JUDGE

freopen("test.in", "r", stdin);

#endif

int u, v, arc, max_idx, node, z(1);

memset(in, 0, sizeof(in));

memset(hash, 0, sizeof(hash));

memset(head, -1, sizeof(head));

memset(visit, 0, sizeof(visit));

arc = max_idx = node = cnt = 0;

while( scanf("%d %d", &u, &v) ) {

if( u < 0 && v < 0 ) {

break;

}

if( !u && !v ) {

printf("Case %d ", z ++);

if( judge(arc, node, max_idx) ) {

printf("is a tree.\n");

}

else {

printf("is not a tree.\n");

}

memset(in, 0, sizeof(int)*(max_idx+1));

memset(hash, 0, sizeof(int)*(max_idx+1));

memset(head, -1, sizeof(int)*(max_idx+1));

memset(visit, 0, sizeof(int)*(max_idx+1));

arc = node = max_idx = cnt = 0;

continue;

}

insert_arc(u, v), in[v] += 1;

arc += 1, max_idx = max(max_idx, max(u, v));

if( !hash[u] ) {

node += 1, hash[u] = 1;

}

if( !hash[v] ) {

node += 1, hash[v] = 1;

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: