avatar
Re: 痛经帖 (转载)# Joke - 肚皮舞运动
a*a
1
write a function to copy a DAG.
class Node {
int value;
vector neighbors;
};
Node *copyGraph(Node *root) {
// add code here
}
avatar
t*y
2
【 以下文字转载自 NewYork 讨论区 】
发信人: lulushz (lulushz), 信区: NewYork
标 题: Re: 痛经帖
发信站: BBS 未名空间站 (Mon Dec 12 20:39:12 2011, 美东)
你这小姑娘,哎呀,不是打篮球这种运动啦,是指那个那个二人运动啦!
你没听老人常说痛经呀,结婚以后就好了;不然就说生完孩子就好了。。。
avatar
p*2
3
DFS就可以了吧?
avatar
i*a
4
哦, 是乒乓球

【在 t*******y 的大作中提到】
: 【 以下文字转载自 NewYork 讨论区 】
: 发信人: lulushz (lulushz), 信区: NewYork
: 标 题: Re: 痛经帖
: 发信站: BBS 未名空间站 (Mon Dec 12 20:39:12 2011, 美东)
: 你这小姑娘,哎呀,不是打篮球这种运动啦,是指那个那个二人运动啦!
: 你没听老人常说痛经呀,结婚以后就好了;不然就说生完孩子就好了。。。

avatar
l*z
6
pia~~~~~
TD哥,未经本人同意私自转载,你得赔我个包子!!
人家说的实话嘛,你男的,老太太们才不给你传授这些呢!切!!

【在 t*******y 的大作中提到】
: 【 以下文字转载自 NewYork 讨论区 】
: 发信人: lulushz (lulushz), 信区: NewYork
: 标 题: Re: 痛经帖
: 发信站: BBS 未名空间站 (Mon Dec 12 20:39:12 2011, 美东)
: 你这小姑娘,哎呀,不是打篮球这种运动啦,是指那个那个二人运动啦!
: 你没听老人常说痛经呀,结婚以后就好了;不然就说生完孩子就好了。。。

avatar
q*c
7
BFS, DFS 都可以,这题关键是考怎么copy links.
avatar
s*a
8
哦,原来如此
avatar
d*u
10
同意,如果有个节点只有out edge没有in edge,那这个节点拷贝不到。。。

【在 p*****2 的大作中提到】
:
: 这个图只给一个节点不行吧?根本连不全。

avatar
a*a
11
随便画了个简单的DAG, 如下图,
如果用DFS的话,假如我用一个queue,
enqueue root, 然check队列是否为空,不为空就enqueue children(neighbors),
在dequeue node 2的时候,enqueue node 4&5,
在dequeue node 3的时候,不应该enqueue node 5,对吧?因为5已经被访问了,如何
记录这个Node是不是已经被访问过呢(不改动原本的DS)。
想到一个方法是可以用一个数组保存所有被访问过的Node地址,每次进队看是不是在这
个数组里。
如果用递归来做应该也是可行的吧。
class Node{
public:
int value;
vector neighbors;
};
vector visited;
bool isNodeVisited(Node *n)
{
vector::iterator it;
it = find(visited.begin(), visited.end(), n);
return it != visited.end();
}
Node *copyGraph(Node* root) {
if (root) return NULL;
Node* newR = new Node;
newR->value = root->value;
vector& nei = root.neighbors;
vector newNei;
for (int i=0; i{
if (!isNodeVisited(nei[i])){
newNei.push_back(copyGraph(nei[i]));
}
}
newR->neighbors = newNei;
return newR;
}
求前辈们指教!
avatar
c*p
12
建个子类?

【在 a****a 的大作中提到】
: 随便画了个简单的DAG, 如下图,
: 如果用DFS的话,假如我用一个queue,
: enqueue root, 然check队列是否为空,不为空就enqueue children(neighbors),
: 在dequeue node 2的时候,enqueue node 4&5,
: 在dequeue node 3的时候,不应该enqueue node 5,对吧?因为5已经被访问了,如何
: 记录这个Node是不是已经被访问过呢(不改动原本的DS)。
: 想到一个方法是可以用一个数组保存所有被访问过的Node地址,每次进队看是不是在这
: 个数组里。
: 如果用递归来做应该也是可行的吧。
: class Node{

avatar
r*b
13
We can first numbering the nodes of the DAG, and then create a list of new
nodes and re-construct the links:
Here is an implementation for DAG clone:
http://basicalgos.blogspot.com/2012/03/27-clone-directed-acycli

【在 a****a 的大作中提到】
: write a function to copy a DAG.
: class Node {
: int value;
: vector neighbors;
: };
: Node *copyGraph(Node *root) {
: // add code here
: }

avatar
p*2
14

DFS应该不需要Queue吧?递归就行了吧?

【在 a****a 的大作中提到】
: 随便画了个简单的DAG, 如下图,
: 如果用DFS的话,假如我用一个queue,
: enqueue root, 然check队列是否为空,不为空就enqueue children(neighbors),
: 在dequeue node 2的时候,enqueue node 4&5,
: 在dequeue node 3的时候,不应该enqueue node 5,对吧?因为5已经被访问了,如何
: 记录这个Node是不是已经被访问过呢(不改动原本的DS)。
: 想到一个方法是可以用一个数组保存所有被访问过的Node地址,每次进队看是不是在这
: 个数组里。
: 如果用递归来做应该也是可行的吧。
: class Node{

avatar
g*y
15
用queue不就是bfs了吗

【在 p*****2 的大作中提到】
:
: DFS应该不需要Queue吧?递归就行了吧?

avatar
p*2
16

是呀。

【在 g***y 的大作中提到】
: 用queue不就是bfs了吗
avatar
s*n
17
queue + hashTable 也就是bfs了, 还有其他trick吗?
avatar
a*a
18
你那counter没变啊,ms需要改一下

【在 r*****b 的大作中提到】
: We can first numbering the nodes of the DAG, and then create a list of new
: nodes and re-construct the links:
: Here is an implementation for DAG clone:
: http://basicalgos.blogspot.com/2012/03/27-clone-directed-acycli

avatar
g*e
19
只要按照topological order来traverse一遍就行了吧
先复制root
从root开始,查看neighbour中刨去跟root相连的edge外只有输出的node,复制该node。
然后重复寻找这样的Node,一直到完成。
当然,Input root可能有好几个。
avatar
D*g
20
可以maintain一个从原图node到copy node的map,大概是这样:
public static class Node {
public int data;
public List next;
}
static Node copyNode(final Node n) {
if (n == null) return null;
return copyNode(n, new HashMap());
}
static Node copyNode(final Node n, final Map m) {
if (n == null) return null;
if (m.containsKey(n)) return m.get(n);
Node newNode = new Node();
m.put(n, newNode);
newNode.data = n.data;
newNode.next = new ArrayList();
for (int i = 0; i < n.next.size(); ++i) {
newNode.add(copyNode(n.next.get(i), m));
}
}

【在 a****a 的大作中提到】
: write a function to copy a DAG.
: class Node {
: int value;
: vector neighbors;
: };
: Node *copyGraph(Node *root) {
: // add code here
: }

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。