題意:
略
分析:
由於是無向圖且是一棵樹,也就是n個節點,n-1條邊,題目要求是每個定點都是雙連通,也就是所有頂點都在一個強連通分量裏面,這裏可以使用求SSC的算法,但是由於十無向圖使用並查集的變成複雜度降低了很多,trick:0 0 -> No.
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;
int parent[MAXN], hash[MAXN];
inline int get_parent(int x)
{
return x == parent[x]? x : parent[x] = get_parent(parent[x]);
}
int judge(int arc, int node, int max_idx)
{
if( !arc ) {
return 1;
}
if( arc != node-1 ) {
return 0;
}
REPI(i, 1, max_idx) {
parent[i] = get_parent(i);
}
int idx = 1, pre;
while( idx <= max_idx && !hash[idx] ) {
idx += 1;
}
pre = parent[idx];
REPI(i, idx, max_idx) {
if( !hash[i] ) {
continue;
}
if( parent[i] != pre ) {
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;
REPI(i, 1, MAXN-1) {
parent[i] = i;
}
memset(hash, 0, sizeof(hash));
arc = max_idx = node = 0;
while( scanf("%d %d", &u, &v) ) {
if( -1 == u && -1 == v ) {
break;
}
if( !u && !v ) {
if( judge(arc, node, max_idx) ) {
printf("Yes\n");
}
else {
printf("No\n");
}
REPI(i, 1, max_idx) {
parent[i] = i;
}
memset(hash, 0, sizeof(int)*(max_idx+1));
arc = node = max_idx = 0;
continue;
}
int pu = get_parent(u);
int pv = get_parent(v);
if( pu != pv ) {
parent[pu] = pv;
}
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_1272_小希的迷宮(並查集)
最新推荐文章于 2019-10-24 22:24:05 发布