Skip to content

Commit efb140f

Browse files
authored
Update 1719.Number-Of-Ways-To-Reconstruct-A-Tree_v1.cpp
1 parent f76ff9e commit efb140f

File tree

1 file changed

+48
-60
lines changed

1 file changed

+48
-60
lines changed
Lines changed: 48 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,75 @@
11
class Solution {
22
int flag = 1;
3-
unordered_map<int, vector<int>>children;
4-
unordered_map<int, int>father;
5-
unordered_map<int, int>depth;
6-
unordered_map<int, int>childrenCount;
3+
unordered_set<int>nodeSet;
4+
vector<int> relative[501];
5+
int isRelative[501][501];
6+
vector<int> children[501];
7+
unordered_set<int>visited;
78

89
public:
910
int checkWays(vector<vector<int>>& pairs)
1011
{
11-
unordered_map<int,int>order;
12-
unordered_set<int>nodeSet;
1312
for (auto pair: pairs)
1413
{
1514
nodeSet.insert(pair[0]);
16-
nodeSet.insert(pair[1]);
17-
order[pair[0]]++;
18-
order[pair[1]]++;
19-
}
20-
unordered_map<int,vector<pair<int,int>>>relative;
21-
for (auto pair: pairs)
22-
{
23-
relative[pair[0]].push_back({order[pair[1]], pair[1]});
24-
relative[pair[1]].push_back({order[pair[0]], pair[0]});
25-
}
26-
27-
for (auto node: nodeSet)
28-
{
29-
sort(relative[node].begin(), relative[node].end());
30-
int i = relative[node].size()-1;
31-
while (i>=0 && (relative[node][i].first > order[node] || relative[node][i].first == order[node] && relative[node][i].second > node))
32-
{
33-
if (relative[node][i].first == order[node] && flag == 1)
34-
flag = 2;
35-
i--;
36-
}
37-
if (i+1>=0 && i+1 < relative[node].size())
38-
{
39-
int parent = relative[node][i+1].second;
40-
children[parent].push_back(node);
41-
father[node] = parent;
42-
}
15+
nodeSet.insert(pair[1]);
16+
relative[pair[0]].push_back(pair[1]);
17+
relative[pair[1]].push_back(pair[0]);
18+
isRelative[pair[0]][pair[1]] = 1;
19+
isRelative[pair[1]][pair[0]] = 1;
4320
}
4421

22+
vector<int>nodes(nodeSet.begin(), nodeSet.end());
23+
sort(nodes.begin(),nodes.end(),[&](int x,int y)->bool{return relative[x].size()<relative[y].size();});
24+
4525
int root = -1;
46-
for (auto node: nodeSet)
26+
27+
for (int i=0; i<nodes.size(); i++)
4728
{
48-
if (father.find(node)==father.end())
49-
{
50-
if (root!=-1) return 0;
51-
root = node;
29+
int j = i+1;
30+
while (j<nodes.size() && !isRelative[nodes[i]][nodes[j]])
31+
j++;
32+
if (j<nodes.size())
33+
{
34+
children[nodes[j]].push_back(nodes[i]);
35+
if (relative[nodes[j]].size() == relative[nodes[i]].size())
36+
{
37+
flag = 2;
38+
}
5239
}
40+
else
41+
{
42+
if (root==-1)
43+
root = nodes[i];
44+
else
45+
return 0;
46+
}
5347
}
5448

55-
unordered_set<int>visited;
56-
if (dfs(root, visited, 0)==-1)
57-
return 0;
58-
59-
for (auto node: nodeSet)
60-
{
61-
if (order[node]!=depth[node]+childrenCount[node])
62-
return 0;
63-
}
49+
dfs(root,0);
6450

6551
return flag;
6652
}
6753

68-
int dfs(int cur, unordered_set<int>&visited, int d)
54+
int dfs(int cur, int depth)
6955
{
56+
if (flag==0) return -1;
7057
if (visited.find(cur)!=visited.end())
71-
return -1;
58+
{
59+
flag = 0;
60+
return -1;
61+
}
7262
visited.insert(cur);
73-
depth[cur] = d;
74-
75-
int count = 0;
76-
for (auto next: children[cur])
63+
int sum = 0;
64+
for (int child: children[cur])
7765
{
78-
int temp = dfs(next, visited, d+1);
79-
if (temp==-1)
80-
return -1;
81-
else
82-
count+=temp;
66+
sum += dfs(child, depth+1);
67+
}
68+
if (sum+depth!=relative[cur].size())
69+
{
70+
flag = 0;
71+
return -1;
8372
}
84-
childrenCount[cur] = count;
85-
return count+1;
73+
return sum+1;
8674
}
8775
};

0 commit comments

Comments
 (0)