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;
}
判斷輸入的數據是否是一棵有向樹
分析:
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;
}
相关文章推荐
- HDU 1325 Is It A Tree?
- hdu1325 Is It A Tree?(有向图并查集)
- 【HDU - 1325】Is It A Tree?
- 【并查集】HDU 1325 Is It A Tree?
- 【并查集】HDU 1325 Is It A Tree?
- hdu 1325 Is It A Tree? (并查集)
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- HDU 1325 - Is It A Tree?
- hdu 1325 is it a tree?
- HDU 1325 Is It A Tree?
- HDU-1325-Is It A Tree?
- HDU 1325 Is It A Tree?
- HDU 1325 Is It A Tree?
- 【并查集】HDU 1325 Is It A Tree?
- hdu---(1325)Is It A Tree?(并查集)
- HDU 1325 Is It A Tree?(并查集简单题)
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree?
- hdu 1325 Is It A Tree? (并查集)