- while ( c = ' ' || c == '\t' || c == '\n' ) c = getc (f);
时间: 2023-11-01 21:54:35 浏览: 45
这是一个在读取文件时跳过空格、制表符和换行符的代码片段。它使用了一个 while 循环,条件中包含了三个条件表达式:c = ' '、c == '\t' 和 c == '\n'。这些条件表达式分别检查当前字符是否为空格、制表符或换行符。
在每次循环迭代中,程序将使用 getc 函数从文件中读取一个字符,并将其赋值给变量 c。如果 c 的值是空格、制表符或换行符中的任意一个,那么循环将继续执行下去,直到读取到一个不是空格、制表符或换行符的字符,才会停止循环。
这段代码的作用是跳过文件中连续的空格、制表符和换行符,直到遇到一个非空白字符为止。
相关问题
void Hungarian::SubX_AddY() { int i, j, t; double Delta; set<int> VisitedX, VisitedY; /* Để ý rằng: VisitedY = {y \ Trace[y] khác -1} VisitedX = {start} giao match(VisitedY) = {start} giao {matchY[y] Trace[y] khác -1} */ VisitedX.insert(start); for (j = 0; j < k; j++) { if (Trace[j] != -1) { VisitedX.insert(matchY[j]); VisitedY.insert(j); } }Delta = maxC; for (i = 0; i < k; i++) { if (VisitedX.find(i) != VisitedX.end()) { for (j = 0; j < k; j++) { if ((VisitedY.find(j) == VisitedY.end()) && (GetC(i, j) < Delta)) Delta = GetC(i, j); } } }for (t = 0; t < k; t++) { //trừ trọng số những cạnh liên thuộc với VisitedX đi Delta if (VisitedX.find(t) != VisitedX.end()) Fx[t] = Fx[t] + Delta; //Cộng trọng số những cạnh liên thuộc với VisitedY lên Delta if (VisitedY.find(t) != VisitedY.end()) Fy[t] = Fy[t] - Delta; } }
这段代码是匈牙利算法中的"SubX_AddY"步骤,用于更新节点权值。具体来说,它的作用是从未被匹配的点中找出与已被匹配的点相邻且边权最小的点,然后更新所有与这些点相邻的点的权值。这个过程会涉及到两个向量Fx和Fy,它们分别表示未被匹配的点和已被匹配的点的权值。在这个过程中,我们先将所有与已被匹配的点相邻的点加入VisitedX和VisitedY中,然后遍历VisitedX中的所有点,找到与之相邻且未被匹配的点中边权最小的点,记为Delta,然后更新所有与VisitedX和VisitedY相邻的点的权值。具体来说,对于VisitedX中的点,我们将它们的权值加上Delta,对于VisitedY中的点,我们将它们的权值减去Delta。这样做的目的是为了使已被匹配的点的权值尽量小,从而使匹配的代价最小化。
void Hungarian::FindAugmentingPath() { queue<int> q; int i, j, first, last; for (i = 0; i < MAX;i++) { Trace[i] = -1; } ///memset(Trace, -1, sizeof(Trace)); //chạy thuật toán BFS để tìm đường mở q.push(start); first = 0; last = 0; do { i = q.front(); q.pop(); for (j = 0; j < k; j++) { if (Trace[j] == -1 && GetC(i, j) == 0.0f) { Trace[j] = i; if (matchY[j] == -1) { finish = j; return; } q.push(matchY[j]); } } } while (!q.empty()); }
这是一个匈牙利算法中寻找增广路径的函数。具体来说,该函数使用广度优先搜索(BFS)来在二分图中寻找增广路径。
输入:无
输出:无,但是函数会更新Trace数组,该数组用于记录增广路的路径。
算法步骤如下:
1. 将Trace数组初始化为-1。
2. 将起始节点start加入队列q中,并将first和last初始化为0。
3. 在一个do-while循环中,从队列q中取出一个节点i,然后遍历与该节点相邻的所有节点j。
4. 如果节点j尚未被访问过(即Trace[j]为-1),并且从节点i到节点j的边权值为0,那么就更新Trace[j]为i,并将与节点j相邻的右部节点加入队列q中。
5. 如果节点j已经匹配了一个左部节点(即matchY[j]不为-1),那么就将其所匹配的左部节点加入队列q中。
6. 当队列q为空时,表示已经遍历完所有可能的增广路径,函数结束。如果找到了一条增广路(即在遍历过程中找到了一个未匹配的右部节点),那么就将该右部节点记录在finish变量中,然后函数返回。
阅读全文