C# 反转图形
(我希望我正确使用了“反转”)C# 反转图形,c#,linq,graph-theory,C#,Linq,Graph Theory,(我希望我正确使用了“反转”) 我有一个节点(对象)和边的集合(节点引用的其他对象的列表)。整个图形在字典中表示,您可以简单地反转,只需说“对于每个节点,在其邻居列表中查找具有该节点的所有顶点”(如果有可以访问的节点,但没有任何邻居,则联合是必要的,但如果字典中有一个v->{}形式的条目,则联合是不必要的): 这对我很有用: var result = graph.Keys .Union(graph.SelectMany(x => x.Value)) .Distinct()
我有一个节点(对象)和边的集合(节点引用的其他对象的列表)。整个图形在
字典中表示,您可以简单地反转,只需说“对于每个节点,在其邻居列表中查找具有该节点的所有顶点”(如果有可以访问的节点,但没有任何邻居,则联合是必要的,但如果字典中有一个v->{}
形式的条目,则联合是不必要的):
这对我很有用:
var result = graph.Keys
.Union(graph.SelectMany(x => x.Value))
.Distinct()
.ToDictionary(
x => x,
x => graph.Where(y => y.Value.Contains(x)).Select(y => y.Key).ToList()
);
结合:
foreach (var element in result)
{
Console.WriteLine(element.Key + ": " + string.Join(", ", element.Value));
}
吐出:
答:
B:D
C:A
D:A,B,C
无论如何,我想我应该提供一个替代方案。您可以直接在原始字典上调用.ToDictionary():
var inverse = graph.Keys
.Union(
graph.Values
.SelectMany(v => v)
.Distinct()
)
.ToDictionary(
v => v,
v => graph.Keys.Where(key => graph[key].Contains(v))
);
var inverse = graph.ToDictionary(
i => i.Key,
i => graph.Where(j => j.Value.Contains(i.Key))
.Select(j => j.Key)
.Distinct()
.ToList());
这将选择当前键作为反向字典条目的键,然后通过选择边缘列表值包含目标键的键并调用.ToList(),从原始字典中的对中创建一个新列表。在“道德等价”示例中,没有“C”数据的是什么?不是“a”在第一个数据集中指向它。@Kirk,那是因为我很迟钝。我在白板上画出了这个例子,但遗漏了一条边!但是,是的,谢谢!这只需要一个边列表就可以了。@Jeff,不幸的是,对象通常不能用AB BA
格式表示。)还有,安尼的回答到哪里去了?我想说的是,我可以不获取空集,实际上,我不会有任何这样的数据。因为你和Ani的答案几乎相同,但Ani的答案不再存在,那么你就得到了勾号。
foreach (var element in result)
{
Console.WriteLine(element.Key + ": " + string.Join(", ", element.Value));
}
var inverse = graph.ToDictionary(
i => i.Key,
i => graph.Where(j => j.Value.Contains(i.Key))
.Select(j => j.Key)
.Distinct()
.ToList());