- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
public class Graph
{
public Graph()
{
Vertices = new Dictionary<int, List<int>>();
}
public Dictionary<int,List<int>> Vertices { get; set; }
public void ApplyKrager()
{
var random = new Random();
while (Vertices.Count > 2)
{
var randomIndex = random.Next(0,Vertices.Keys.Count);
var firstVertex = Vertices.Keys.ElementAt(randomIndex);
var secondVertex = Vertices[firstVertex].ElementAt(random.Next(0,Vertices[firstVertex].Count));
if (Vertices.ContainsKey(secondVertex))
{
Console.WriteLine();
Console.WriteLine("Merging " + firstVertex + " " + secondVertex);
//Merge
foreach (var edge in Vertices[secondVertex])
{
if (!Vertices[firstVertex].Contains(edge))
Vertices[firstVertex].Add(edge);
}
//change all the occurences of the secondVertex to the first
foreach (var vertex in Vertices)
{
if (vertex.Value.Contains(secondVertex))
{
vertex.Value.Remove(secondVertex);
vertex.Value.Add(firstVertex);
}
}
//Remove Self Loops
Vertices[firstVertex].RemoveAll(_ => _ == firstVertex);
Vertices.Remove(secondVertex);
}
//Print();
}
}
public void Print()
{
foreach (var v in Vertices)
{
Console.WriteLine("Vertex is : " + v.Key);
Console.Write("Edges are ");
foreach (var edge in v.Value)
{
Console.Write(edge + " ");
}
Console.WriteLine();
}
}
}
运行此代码的测试
[Fact]
public void CheckForMinimumCuts()
{
var input = File.ReadAllLines(@"input.txt");
var directedEdges = new Dictionary<int, List<int>>();
foreach (var line in input)
{
var adjacency = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var vertex = Convert.ToInt32(adjacency[0]);
var edges = new List<int>();
for (int i = 1, j = 0; i < adjacency.Length; i++)
{
edges.Add(Convert.ToInt32(adjacency[i]));
}
directedEdges.Add(vertex, edges);
}
var cuts = new List<int>();
for (int i = 0; i < 500; i++)
{
var graph = new Graph {Vertices = directedEdges};
graph.ApplyKrager();
foreach (var v in graph.Vertices)
{
cuts.Add(v.Value.Count);
}
}
Console.WriteLine(cuts.Min());
}
//输入.txt
1 3 4 2
2 1 4 3
3 1 2 4
4 5 3 2 1
5 4 8 6 7
6 8 7 5
7 5 8 6
8 5 7 6
expected result: 1
cut is [(4,5)]
上面的算法没有给出正确的输出,即使运行多次实现随机化也是如此。
我选择的随机边是否有偏差?
我应该改为执行 cuts.Add(graph.Vertices.first().count() 吗?
或者我的算法编码不正确,因此没有正确输出的机会?
注意:试图将此问题标记为家庭作业..找不到标签。
最佳答案
随机收缩最小切割算法要求您统一随机选择一条边。您统一随机选择一个顶点,然后统一随机选择与该顶点关联的边。
您可能还有一个我看不到的实现错误,因为我不懂 C#。如果您的算法在 8 顶点图上进行 500 次迭代仍无法识别最小切割,我会感到惊讶。 new Random()
是否每次都生成具有相同种子的 RNG?
关于c# - 在 C# 中使用 Krager 算法求解最小切割图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17777054/
我正在使用混合效应模型,并且由于我的方法的特殊性我需要解决下面模型的积分,然后制作图表获得的估计值。 换句话说,我需要求解下面的积分: 其中,di^2 是我模型中的 Var3,dh 是混合效应模型对应
我有一个方程组,我想用数值方法求解它。给定起始种子,我想得到一个接近的解决方案。让我解释。 我有一个常量向量,X,值: X <- (c(1,-2,3,4)) 和一个向量 W 的权重: W <- (c(
假设我有以下方程组: a * b = 5 sqrt(a * b^2) = 10 如何求解 R 中 a 和 b 的这些方程? 我想这个问题可以说是一个优化问题,具有以下功能......? fn <- f
我在 R 中有一个简单的通量模型。它归结为两个微分方程,对模型中的两个状态变量进行建模,我们将它们称为 A和 B .它们被计算为四个分量通量的简单差分方程 flux1-flux4 , 5 个参数 p1
R有什么办法吗?求解给定单变量函数的反函数?动机是我以后告诉R使用值向量作为反函数的输入,以便它可以吐出反函数值。 例如,我有函数 y(x) = x^2 ,逆是 y = sqrt(x) .有没有办法R
我在字符串中有以下方程 y = 18774x + 82795 求解x我会这样做:- x = (y-82795) / 18774 我知道y的值 但是方程一直在变化,并且始终采用字符串格式 是否可以简单地
如果我用 diophantine(2*x+3*y-5*z-77) 我收到了这个结果。 {(t_0, -9*t_0 - 5*t_1 + 154, -5*t_0 - 3*t_1 + 77)} 到目前为止还
我正在尝试求解仅限于正解的 ODE,即: dx/dt=f(x) x>=0。 在 MATLAB 中这很容易实现。 R 是否有任何变通方法或包来将解决方案空间限制为仅正值? 这对我来说非常重要,不幸的是没
下面的 ANTLR 文法中的 'expr' 规则显然是相互左递归的。作为一个 ANTLR 新手,我很难解决这个问题。我已经阅读了 ANTLR 引用书中的“解决非 LL(*) 冲突”,但我仍然没有看到解
我有一个关于在 R 中求解函数的可能性的非常基本的问题,但知道答案确实有助于更好地理解 R。 我有以下等式: 0=-100/(1+r)+(100-50)/(1+r)^2+(100-50)/(1+r)^
我正在编写使用递归回溯来解决 8 个皇后问题的代码(将 n 个国际象棋皇后放在 n × n 的棋盘上,这样皇后就不会互相攻击)。 我的任务是创建两个方法:编写一个公共(public)solveQuee
我不知道在以下情况下如何进行,因为最后一个方程没有所有 4 个变量。所以使用了等式下面的代码,但这是错误的......有谁知道如何进行? 方程: 3a + 4b - 5c + d = 10 2a +
假设我们有这个递归关系,它出现在 AVL 树的分析中: F1 = 1 F2 = 2 Fn = Fn - 1 + Fn - 2 + 1(其中 n ≥ 3) 你将如何解决这个递归以获得 F(n) 的封闭形
在Maple中,有谁知道是否存在一个函数来求解变量?例如,我正在尝试求解 r 的 solve4r=(M-x^y)*(r^(-1)) mod (p-1)。所以我知道 M、x、y 和 p 的值,但不知道
我也问过这个here在声音设计论坛上,但问题是沉重的计算机科学/数学,所以它实际上可能属于这个论坛: 因此,通过读取文件中的二进制文件,我能够成功地找到关于 WAV 文件的所有信息,除了 big si
我有以下问题: 设 a 和 b 为 boolean 变量。是否可以设置 a 和 b 的值以使以下表达式的计算结果为 false? b or (((not a) or (not a)) or (a or
我需要用 C 求解这个超越方程: x = 2.0 - 0.5sen(x) 我试过这个: double x, newx, delta; x = 2.0 - 0.5; newx = sin(x); del
我在 Windows 上使用 OpenCV 3.1。 一段代码: RNG rng; // random number generator cv::Mat rVec = (cv::Mat_(3, 1)
我正在尝试求解一个包含 3 个变量和数量可变的方程的方程组。 基本上,系统的长度在 5 到 12 个方程之间,无论有多少个方程,我都试图求解 3 个变量。 看起来像这样: (x-A)**2 + (y-
我正在尝试为有限差分法设计一种算法,但我有点困惑。所讨论的 ODE 是 y''-5y'+10y = 10x,其中 y(0)=0 且 y(1)=100。所以我需要一种方法来以某种方式获得将从关系中乘以“
我是一名优秀的程序员,十分优秀!