[算法] 找到最短路径的Dijkstra, 弗洛伊德
更新 25/05/2014: 做一些你的意见,所以我写了 1 Dijkstra算法程序的结构和功能的方式也略有修改代码更明亮,更准确的^^.
更新 27/09/2014: 该算法的额外帕斯卡代码在这里: http://ideone.com/c7J0dq
内容
Dijkstra算法
弗洛伊德算法
先进的代码 2 算法
在这篇文章中只是指算法找到最短路径的Dijkstra和Floyd, 一些相关的术语我就不解释或定义, 你发现在书籍或在互联网上.
的单源最短路径问题的问题是要找到两个顶点之间的路径,使得构成该最小路边缘的权重的总和. 或者把它的数学:
对于单连通图, 加权G =(该,和). 找到距离d(该,B) 从给定的顶点至G的顶点和b的任何发现从最短路径到b.
正如文章标题, 我们将学习 2 算法采用邻接矩阵结构来解决(注意,我们考虑图的重量不为负).
具有n个顶点的曲线图的邻接矩阵是一个正方形矩阵G n是行列的数. 摹[在][Ĵ] 从i到顶点Ĵ顶部路径的长度. 考虑到无向图G[在][Ĵ] = G[Ĵ][在]. 从上长度本身 0 (摹[在][在] = 0). 如果之间 2 图i和j的边缘不存在的方式,它ģ[在][Ĵ] =无限 (∞). 但是,计算机的性能,该值被设定为∞ 1 常数是非常大的或基质的总价值 (所述边缘的总长度).
1. Dijkstra算法
关于Dijkstra算法有 2 类型是找到从最短路径 1 来源页首 1 首选目的地,找到的最短路径 1 源顶点到图的左上角, 在这里我就说说的东西 1. (第二类,你可以在网络上找到或者只是改变了行 而 (s[B] == 0) (当前 43 通过代码 1 & 当前 76 通过代码 2) 从循环浏览器 0 n-1个是要找到所有顶点).
– 使用 1 莱恩阵列[] – 只[在] 是从一个顶点的最短距离到顶点我.
– 使用 1 薄板S标记的特殊顶点我 (峰值电流i那时,从一个路径到i是最短).
– 使用数组P[] 显着的路径. P[Ĵ] 如果I = I j是超前的最短路径的峰值.
– 复位顶对没有办法极其宝贵.
– 初始化所有的方式,从亚洲到其他峰在极.
– 从初级到初始化路径= 0.
– 浏览图表V的所有顶点
+ 发现上面我不是S中,从一个路径我是最短纳入S中. 如果你找不到批准峰顶可以去还是任何手段都没有找到前目的地=> 走不了.
+ 如果您发现顶点I J浏览所有顶点不属于S. 如果len[在] + 摹[在][Ĵ] < 只[Ĵ] (其中G[在][Ĵ] 是从顶点i到顶点j中的距离) 然后分配莱恩[Ĵ] =莱恩[在] + 摹[在][Ĵ]; 并标明路径P[Ĵ] =我.
注意: 因为在C, 阵列出发 0. 因此,计算峰值的时候会从顶部 0 前n-1. 但是,它仍然表明是从顶 1 到n和input.inp顶端和顶端的文件将被从计算 1 到n. 因此,编码之前,我们需要减少计算和行驶尖的顶端 1 单元. 计算完成后,其结果,当需要增加的道路的峰值仰视 1 单位正常显示 (例如,我们要计算从顶部的路径 4 页首 8, 顶 4 对应于该位置 3 阵列中, 顶 8 相应的位置 7 因此,我们需要减少 4 向下 3, 8 向下 7 计算. 当你找到一种方法, 假设 3 -> 5 -> 4 -> 7 必须到位作为 4 -> 6 -> 5 -> 8).
我们会根据下面的图表去实践 2 代码是做正确的,并按照主要内容:
文件 input.inp: 第一行是 8 点, 离点 4 扼要 8. 矩阵8×8 下面是图的邻接矩阵.
8 4 8 0 3 5 2 0 0 0 0 3 0 1 0 7 0 0 0 5 1 0 4 0 1 0 0 2 0 4 0 0 3 6 0 0 7 0 0 0 2 0 3 0 0 1 3 2 0 4 6 0 0 0 6 0 4 0 5 0 0 0 0 3 6 5 0
* 在主代码
本准则进行了修订,并修复一些漏洞 代码天前 (或 链路冗余).
#include <stdio.h> #include <stdlib.h> #define INP "input.inp" #define OUT "output.out" int main() { FILE *fi = fopen(INP, "r"); FILE *fo = fopen(OUT, "w"); int n, a, b, i, sum = 0; // nhap du lieu tu file input fscanf(fi, "%d%d%d", &n, &a, &b); int G[n][n]; int S[n], Len[n], P[n]; // nhap ma tran va tinh gia tri vo cung (sum) for (i = 0; i < n; i++) for (int j = 0; j < n; j++) { fscanf(fi, "%d", &G[i][j]); sum += G[i][j]; } // dat vo cung cho tat ca cap canh khong noi voi nhau for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i != j && G[i][j] == 0) G[i][j] = sum; } } /* Do mang tinh tu G[0][0] nen can giam vi tri di 1 don vi de tinh toan cho phu hop*/ a--; b--; for (int i = 0; i < n; i++) { Len[i] = sum; // khoi tao do dai tu a toi moi dinh la vo cung S[i] = 0; // danh sach cac diem da xet P[i] = a; // dat diem bat dau cua moi diem la a } Len[a] = 0; // dat do dai tu a -> a la 0 // tim duong di ngan nhat tu 1 dinh den moi dinh khac thi thay bang vong for: //for (int k = 0; k < n; k++) while (S[b] == 0) { // trong khi diem cuoi chua duoc xet for (i = 0; i < n; i++) // tim 1 vi tri ma khong phai la vo cung if (!S[i] && Len[i] < sum) break; // i >=n tuc la duyet het cac dinh ma khong the tim thay dinh b -> thoat if (i >= n) { printf("done dijkstra\n"); break; } for (int j = 0; j < n; j++) { // tim diem co vi tri ma do dai la min if (!S[j] && Len[i] > Len[j]) { i = j; } } S[i] = 1; // cho i vao danh sach xet roi for (int j = 0; j < n; j++) { // tinh lai do dai cua cac diem chua xet if (!S[j] && Len[i] + G[i][j] < Len[j]) { Len[j] = Len[i] + G[i][j]; // thay doi len P[j] = i; // danh dau diem truoc no } } } printf("done dijkstra\n"); /* Do ta dang tinh toan tu dinh 0 nen muon hien thi tu dinh 1 thi can dung i + 1 de phu hop */ printf("start find path\n"); if (Len[b] > 0 && Len[b] < sum) { fprintf(fo, "Length of %d to %d is %d\n", a + 1, b + 1, Len[b]); // truy vet while (i != a) { fprintf(fo, "%d <-- ", i + 1); i = P[i]; } fprintf(fo, "%d", a + 1); } else { fprintf(fo, "khong co duong di tu %d den %d\n", a + 1, b + 1); } printf("done find path\n"); fclose(fi); fclose(fo); printf("done - open file output to see result\n"); return 0; }
升预防油墨
* 每个功能的代码
在代码包含作为功能:
– READDATA 实施读取输入文件.
– Dijkstra算法 实现算法
– 背部 实现返回的字符串是找到办法
– outResult 在输出文件中执行的结果
#include <stdio.h> #include <stdlib.h> #include <cstring> #define INP "input.inp" #define OUT "output.out" // read data in file input int readData(int ***G, int *n, int *a, int *b) { FILE *fi = fopen(INP, "r"); if (fi == NULL) { printf("file input not found!\n"); return 0; } printf("start read file\n"); fscanf(fi, "%d %d %d", n, a, b); *G = (int **) malloc((*n) * sizeof(int)); for (int i = 0; i < *n; i++) { (*G)[i] = (int *) malloc((*n) * sizeof(int)); for (int j = 0; j < *n; j++) { int x; fscanf(fi, "%d", &x); (*G)[i][j] = x; } } fclose(fi); printf("done read file\n"); return 1; } // thuat toan dijkstra int dijkstra(int **G, int n, int a, int b, int P[]) { /* Do mang tinh tu G[0][0] nen can giam vi tri di 1 don vi de tinh toan cho phu hop*/ a--; b--; printf("start dijkstra\n"); int* Len = (int *) malloc(n * sizeof(int)); int* S = (int *) malloc(n * sizeof(int)); int sum = 0; // gia tri vo cung // tinh gia tri vo cung (sum) for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { sum += G[i][j]; } } // dat vo cung cho tat ca cap canh khong noi voi nhau for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i != j && G[i][j] == 0) G[i][j] = sum; } } for (int i = 0; i < n; i++) { Len[i] = sum; // khoi tao do dai tu a toi moi dinh la vo cung S[i] = 0; // danh sach cac diem da xet P[i] = a; // dat diem bat dau cua moi diem la a } Len[a] = 0; // dat do dai tu a -> a la 0 int i; // tim duong di ngan nhat tu 1 dinh den moi dinh khac thi thay bang vong for: //for (int k = 0; k < n; k++) while (S[b] == 0) { // trong khi diem cuoi chua duoc xet for (i = 0; i < n; i++) // tim 1 vi tri ma khong phai la vo cung if (!S[i] && Len[i] < sum) break; // i >=n tuc la duyet het cac dinh ma khong the tim thay dinh b -> thoat if (i >= n) { printf("done dijkstra\n"); return 0; } for (int j = 0; j < n; j++) { // tim diem co vi tri ma do dai la min if (!S[j] && Len[i] > Len[j]) i = j; } S[i] = 1; // cho i vao danh sach xet roi for (int j = 0; j < n; j++) { // tinh lai do dai cua cac diem chua xet if (!S[j] && Len[i] + G[i][j] < Len[j]) { Len[j] = Len[i] + G[i][j]; // thay doi len P[j] = i; // danh dau diem truoc no } } } printf("done dijkstra\n"); return Len[b]; } // truy vet duong di void back(int a, int b, int *P, int n, char *path) { //char *path = (char *) malloc((n * 10) * sizeof(char)); /* Do mang tinh tu G[0][0] nen can giam vi tri di 1 don vi de tinh toan cho phu hop*/ a--; b--; printf("start find path\n"); int i = b; int point[n]; // danh sach cac dinh cua duong di int count = 0; /* Do ta dang tinh toan tu dinh 0 nen muon hien thi tu dinh 1 thi can dung i + 1 de phu hop */ point[count++] = i + 1; while (i != a) { i = P[i]; point[count++] = i + 1; } strcpy(path, ""); char temp[10]; for (i = count - 1; i >= 0; i--) { sprintf(temp, "%d", point[i]); strcat(path, temp); if (i > 0) { sprintf(temp, " --> "); strcat(path, temp); } } printf("done find path\n"); } void outResult(int len, char* path) { FILE *fo = fopen(OUT, "w"); if (len > 0) { fprintf(fo, "\nLength of %c to %c is %d\n", path[0], path[strlen(path) - 1], len); } fprintf(fo, "path: %s\n", path); fclose(fo); } int main() { int **G, n, a, b, len; if (readData(&G, &n, &a, &b) == 0) { return 0; } char *path = (char *) malloc((10 * n) * sizeof(char)); int P[n]; len = dijkstra(G, n, a, b, P); if (len > 0) { back(a, b, P, n, path); outResult(len, path); } else { char *path = (char *) malloc((n * 10) * sizeof(char)); sprintf(path, "khong co duong di tu %d den %d\n", a, b); outResult(len, path); } printf("done - open file output to see result\n"); return 0; }
看代码似乎有点长,但阅读长传TEO那么什么时候@@ =)).
2. 弗洛伊德算法
该算法允许我们发现每对顶点之间的最短路径.
如果k的顶点所在的最短路径上,从顶点i到顶点Ĵ,该距离从i到j和从第j到j的最短路径从i到j和从第j至j对应. 因此,我们使用矩阵A为节省每对顶点之间的最短路径长度.
– 最初,我们设置了一个[在,Ĵ] = C[在,Ĵ], 容器是最初的直接路径长度 (不走在上面的所有).
– 然后执行n次迭代, 第一k次迭代之后, ma trận A sẽ chứa độ dài đường đi ngắn nhất giữa mọi cặp đỉnh chỉ đi qua các đỉnh thuộc tập .comment-content 1. 这样, n次迭代之后,我们得到矩阵A中包含的最短路径的每对顶点中的曲线之间的长度.
– AK是矩阵符号后来的k次迭代, 即阿克[在,Ĵ] là độ dài đường đi ngắn nhất từ i đến j chỉ đi qua các đỉnh thuộc .comment-content 0. 如果[在,Ĵ] 根据下列公式计算: 如果[在,Ĵ] = min .comment-body 9.
– 在迭代过程中,我们必须保存跟踪路径, 即最短路径穿过顶点. 然后我们使用子阵列P[n×n个], 中P[在,Ĵ] 补足如果k最短路径i到与信经过峰. 起初P[在,Ĵ]= 0对所有的i,Ĵ, 因为这时的最短路径是直接路径, 不走在上面的所有.
编码算法:
void Floyd (int a, int b) { int max = tongthiethai(); for (int i=0; i<n; i++) for (int j=0; j<n; j++) { if (G[i][j]) A[i][j] = G[i][j]; else A[i][j] = max; P[i][j] = -1; } for (int k=0; k<n; k++) // lap n lan { for (int i=0; i<n; i++) // thay doi do dai duong di cua cac dinh for (int j=0; j<n; j++) if (A[i][j] > A[i][k] + A[k][j]) { A[i][j] = A[i][k] + A[k][j]; P[i][j] = k ; } } }
先进的代码
这是供选择的代码 1 在 2 算法和输出文件按照该过程的结果在下面的图片 或备份链路
文件input.inp:
8
A B C D E F G H
0 3 5 2 0 0 0 0
3 0 1 0 7 0 0 0
5 1 0 4 0 1 0 0
2 0 4 0 0 3 6 0
0 7 0 0 0 2 0 3
0 0 1 3 2 0 4 6
0 0 0 6 0 4 0 5
0 0 0 0 3 6 5 0
菜单控制台
输出的Dijkstra
输出弗洛伊德
海我为什么跑几乎每贴现贷款,找到我的路. 丝绒阶段手,仍有.
@@您仔细查看代码输入脱机文件. 他的竞选OK.
运行时,朋友星星复制代码最后一个完整的文章有关此错误
[错误] Ç:\用户管理下载 ideone_DpaGPW.cpp:167: 需要功能的Dijkstra E2313常量表达式(GRAPH,INT,INT)
[错误] Ç:\用户管理下载 ideone_DpaGPW.cpp:283: 需要在功能弗洛伊德E2313常量表达式(GRAPH,INT,INT)
你复制的代码,但? 重新提交的邮件的文件 nguyenvanquan7826@gmail.com 离线看到自己.
发送邮件和证明
我收到那么, 抓住你运行的代码是罚款, 无论. 也许你用C-免费的,所以它不完美或什么错误. 你打开你的Teamview进行离线观看. 通过斯凯与我联系: nguyenvanquan7826
为什么不能有一个最短路径的@@比例1->4= 1<-2<-3<-4
啊,因为从1-> 8所有他的例子是. 不会 4 哪里.
为什么我运行程序,似乎才发现,你必须输入文件.cpp文件和文件一般.INP 1 文件夹. 谢谢
您查看文件扩展名NHE, 可以结束你的文件不是一个.txt .INP被隐藏.
你出现了与此检查的文件扩展名 赢 7, 这里 赢 10 NHE.
我运行它出现在节目才发现,你必须输入文件.cpp文件和文件一般.INP 1 文件夹. 谢谢
Bạn xem đuôi chính xác của file nhé. Có thể đuôi file bị ẩn và file của bạn thực sự đang là input.inp.txt. bạn xem bài này nhé.http://thuthuat.taimienphi.vn/cach-hien-duoi-file-trong-win-10-21939n.aspx
您可以更改代码转换成Pascal是不是这样? 知道 99% 答案将是 “我很忙!” 但还是希望你能转成 1 用Pascal写的比新手要传播知识的代码是不流利C语言.
感谢您的阅读.
我会尽力帕斯卡代码转换成它这个星期. Cảm ơn bạn đã quan tâm tới các bài viết trong blog và đặc biệt là tinh thần chia sẻ của bạn 🙂
你可以看到在PASCAL代码就在这里 http://ideone.com/c7J0dq
非常感谢, VN会把每一天多的人喜欢你.
祝你更多的文章很快或社区谁爱编程.
Cảm ơn bạn 🙂 Mình sẽ cố gắng viết tốt hơn 😉
大哥帮我这个! 我在做课程论文, 发表您的问题如下:
Đồ thị vô hướng G= .comment-body 8 由下式给出列表旁边DS. 粗糙, V诉. 两条路径算法A1建设(在,在) 和A2(在,在) 这样在共同的无边缘和最短的总长度.
我仍然步履蹒跚,但不知道从哪里重新开始,先生. 希望你帮我达姆.
这本质上就是找到最短路径.
A1 + 最短A2 A1和A2最短最短. 您可以使用Dijkstra算法找到A1, A2, 在这个过程中,每次找到A2 1 看到A1的另一侧不具有离线.
谢谢主席先生
该算法他没有,先生VS堆? 我不是很清楚的Dijkstra堆. 否则, 我能做的,或只是电子ķ先生DC?
这一点,他曾与堆做. 这是不是对堆永远抡 :ð. Em thử search trên mạng xem có không 😀
是的,先生. 他问我更多. 随着类别 2, 我想找到的话 1 顶到外面,而不是循环,我不得不再次更改第j先生, K作为以及输入你必须知道如何. 而且, DC的孩子不上再见的每一部分运行代码. 它运行开始的Dijkstra节应先生美眉. 他只能Ëķ长官DC?
从运行时 1 顶点到所有其他顶点旋转仅供浏览整个前完成, 无需添加任何东西.
每个函数的代码,你把建筑,是正常的.
黄金谢谢
我的朋友问过自己ti..minh做这个项目,它使用Java中,你可以更多地解释你的java代码段こDC
忘记,,你真的需要你的帮助,她与nha..minh感谢你多少
你先走, 如果他将帮助 :在
你可以自己解释道姆代码段不运行序列DC艺术 :((.你给你的电话号码,你去
艺术是如何运行顺序?
没有什么是你可以叫他们.
096.567.7826
thấy bạn trl cmt mà rơi nước mắt vì mừng 🙂
Làm gì đến mức đó 😀
欢迎阮文权 , 我可以邀请你知道以下问题DC柯答案 ?
坐标系0xy , 具有以下
A1(586,363),A2(254,137),A3(467,516),A4(798,472),A5(599,213),A6(372,344),A7(146,412),
A8(818,346),A9(850,199),A10(314,260),A11(72,268),A12(731,57),A13(429,179),A14(499,81),
A15(89,169),A16(113,82),A17(904,59),A18(926,551),A19(54,20)
假设 2 任何段连接和无向
长缝 (真正的类型) 之间 2 每股普通数学学习任何类型的DC
起点 : A18(926,551)
表示的路径长度 (真正的类型) 从A18最短派生而来,通过所有其余的 (每个顶点必须经过适当的 1 时间 )
这一切是不同的算法,那么你. 我会尝试看看它的解决方案.
它真的是太无精打采你的算法K掉更多
你不明白的代码或算法? Dijkstra算法不懂艺术或弗洛伊德.
我做了实践基础算法,,,接口会喜欢它?
这是你唯一的选择. 你可以参考你的程序在这里:
https://cachhoc.net/2014/06/14/java-thuat-toan-mo-phong-thuat-toan-dijkstra-tim-duong-di-ngan-nhat/
我哥哥有没有这样的Java代码? 权证一无所知
了解DJK java的未知; C? 它同样, 什么是其他卷.
我的广告, Ë有问题 : 发现在图K个周期的PERT算法的最长路径 .. DC K E特征的广告帮助?
Cái này anh chưa làm mà giờ cũng chưa có thời gian làm nữa 🙂 Em thông cảm nhá.
噢,我的编辑 1 在你的代码位输入 2 从键盘点和移动的printf scanf的CIN和COUT,但没有运行, 你能帮助自己在所有脱机
#包括
#包括
#包括
#定义INP “input.txt中”
使用命名空间STD;
INT主要() {
FILE *科幻=的fopen(“input.txt中”, “ř”);
INTñ, 该, B, 在, 总和= 0;
COUT<>该;
COUT<>B;
的fscanf(是, “%ð%D%D”, &ñ);
INT摹[ñ][ñ];
int类型[ñ], 只[ñ], P[ñ];
为 (I = 0; 在 < ñ; 我 )
为 (INT J = 0; Ĵ < ñ; J ) {
的fscanf(是, "%d", &摹[在][Ĵ]);
总和 = G[在][Ĵ];
}
为 (INT I = 0; 在 < ñ; 我 ) {
为 (INT J = 0; Ĵ < ñ; J ) {
如果 (在 != j的 && 摹[在][Ĵ] == 0)
摹[在][Ĵ] = SUM;
}
}
该–;
B–;
为 (INT I = 0; 在 < ñ; 我 ) {
只[在] = SUM;
S[在] = 0;
P[在] = A;
}
只[该] = 0;
而 (S[B] == 0) {
为 (I = 0; 在 < ñ; 我 )
如果 (!S[在] && 只[在] < 总和)
休息;
为 (INT J = 0; j仅[Ĵ]) {
我= j的;
}
}
S[在] = 1;
为 (INT J = 0; Ĵ < ñ; J ) {
如果 (!S[Ĵ] && 只[在] + 摹[在][Ĵ] 0 && 只[B] < 总和) {
COUT<< " duong di ngan nhat tu dinh "<<该 + 1<<" den dinh"<<B + 1<<" la "<< 只[B];
而 (在 != A) {
COUT<< 在 + 1<<"<– ";
I = P[在];
}
COUT<< 该 + 1;
} 其他 {
COUT<<"khong co duong di tu "<<该 + 1<<" den "<< B + 1;
}
fclose函数(是);
回报 0;
}
您检阅 2 这条线芽.
COUT<>该;
COUT<>B;
CIN是用来&GT;&GT;
COUT使用 <<
其使用CIN>> 和COUT << 但是,你是不是
我只是跑a和b只有输入程序将不会再次运行它停止工作的衣服
他的飞行,他进入A和B只是做它停止工作报告
上面我看到你写了这
COUT<>该;
COUT<>B;
的fscanf(是, “%D%D%D”, &ñ);
COUT帖子 <>
进入每个n,只 1 在%D是不是, 3 金手指…
我的朋友问自己行
” 为 (INT J = 0; j仅[Ĵ])
我= j的;
然后 !S[Ĵ] 意味着?
!S[Ĵ] 即在该点j不.
为什么你是出路
.comment-body 7
为什么不回出口为了让峰值发现应该这样做倒退. 🙂
我不能改回来
得到, 你在上面的代码中看到的离线功能.
服务员, 你得到你的完整代码 http://pastebin.com/FiZzb3UH 复制DEVC 接口上运行,它不像八爷, 它被运行作为基质. 你先生DEVC 5.7.1. 他只是犯了一个错误的地方与你!
你有什么, 此代码将运行界面某种形式对他的文章的结尾说? 你想让它显示如何?
a có thể chuyển code này sang java ko ạ.
C với java khác gì đâu bạn. Nếu muốn có thể xem bài này nhé:
https://cachhoc.net/2014/06/14/java-thuat-toan-mo-phong-thuat-toan-dijkstra-tim-duong-di-ngan-nhat/
b ơi! b có thể giúp mình làm với đồ thị có hướng dc k????
nửa trên với nửa dưới của ma trận là 2 始终朝着正确的方向K B&???
是的,你, 你只需要 2 不同的半是一个有向图,. 例1> 2,但 2 不要去 1 然后,[1][2] = 2, 和A[2][1] =无限.
一个可以做这个算法的仿真不是?? 通过模拟解释代码?? Ë希望学习编程帮助.
你可以看到在这里,请
https://cachhoc.net/2014/06/14/java-thuat-toan-mo-phong-thuat-toan-dijkstra-tim-duong-di-ngan-nhat/
优秀 ! 喜欢你的演示文稿.
我的朋友问自己如何文件input.inp然后创建和在哪里. 他们使用Visual Studio 2010 执行尚未DC
侦探input.inp 1 文件文本的Thoi, 到同一文件夹中的文件.c和的.cpp
VS,我不知道. 我没有用它, 你只是尝试
行. 感谢我的b NHE :在
问自己这个沃肖尔其算法写了这个傲慢的显示恰到好处从W0至小六月底没有看到显示,从无处无处最短路径 . 您可以查看和编辑您的家庭的帮助为k.
代码 :
#包括
#包括
INT主要()
{
INT[10][10];
时int k, ñ, 在, Ĵ;
INT p[10][10];
的printf(“点击上浆ñ:”); scanf函数(“%ð”,&ñ);
//点击W¯¯[0] VA p[0]
为 (I = 0; 在<ñ; 我 ) 为 (J = 0; JW[0]:\ñ”);
为 (I = 0; 在<ñ; 我 )
{
为 (J = 0; J.P[0]:\ñ”);
为 (I = 0; 在<ñ; 我 )
{
为 (J = 0; Ĵ<ñ; J ) 如果 (P[在][Ĵ]!= 32) 的printf("%3c",P[在][Ĵ]+64); 其他的printf("%3c",32);
的printf("\n");
}
残培();
//印刷计算W¯¯[到],P[到] 为k = 1.2,…,到
为 (K = 0; ķ n个[%ð]: P[%ð]:\ñ”,K + 1,K + 1);
为 (I = 0; 在<ñ; 我 )
{
为(J = 0; JW[在][到]+在[到][Ĵ])
{
在[在][Ĵ]= W[在][到]+在[到][Ĵ];
P[在][Ĵ]= P[在][到];
}
的printf (“%3ð”,在[在][Ĵ]);
}
的printf (” || “);
为 (J = 0; Ĵ<ñ; J )
如果(P[在][Ĵ]== 32) 的printf("%3c",P[在][Ĵ]);
其他的printf("%3c",P[在][Ĵ]+64);
的printf("||"); 的printf("\n");
}
}
}
//*心脏的最短路径
的printf("Nhap dinh xuat phat s = "); scanf函数("%d",&s);
的printf("Nhap dinh ket thuc f = "); scanf函数("%d",&˚F);
Dijkstra算法(ñ,该,L,最,s);
如果(L[˚F]== VC) 的printf("Khong co duong di");
其他
{
的printf("\n Duong di tu %d den %d ngan nhat %d \n",s,˚F,L[˚F]);
induong(s,˚F,最);
}
删除大号;
删除PI;
残培();
}
Cái thuật này mình chưa tìm hiểu nên xin lỗi bạn mình chưa rõ 🙂
他问我,弗洛伊德要评估的算法是如何? 我只是说出来 0(ñ^ 3) 他可以指导你评估这个算法こ?谢谢主席先生
你看这文章怎么评价NHE在:
https://www.cachhoc.net/2013/06/14/thuat-toan-p1-cach-tinh-do-phuc-tap-thuat-toan-algorithm-complexity/
自己问上面为什么我跑什么错误代码正楷横行先进的编码
但他的奔跑是好的, 这是你如何错误?
你把* .c文件,它不是C ++库不应该有它. C ++的,你必须图书馆把* .cpp文件
Ë问为什么弗洛伊德使用的Dijkstra负权重不?? e是不明确?? ËK掉
欢迎, 抱歉,你昨天,当你打电话给我,证实了我的偏见仍然忠实于密钥算法负. 要了解这一点,我们必须依靠证明算法如何:
“我们要指出的, 当一个顶点v被添加到集合S, 那么d[在] 最短路径从s到v的价值.
根据定义标签ð, ð[在] 的路径中的最短路径从源s的值, 过在S中的顶, 然后由边缘紫外线直接连接到v.
假设存在从s到v的路径与值小于ð[在]. 因此,在方式, 峰所在秒之间和v不属于S. 写选择第一个这样的峰会.
我的路径取表格S – … – 在 – … – 在. 但由于非负权重的边缘应该片断s – … – W的不超过整条道路的长度大, 因此价值低于ð[在]. 另一方面, 选择我们的W¯¯, 如若片断s的长度 – … – W是[在]. 因此ð[在] < d[v], trái với cách chọn đỉnh v. Đây là điều mâu thuẫn. Vậy điều giả sử của ta là sai. Ta có điều phải chứng minh." Như vậy nếu trọng số của các cạnh có thể âm thì ta không khẳng định được "đoạn s - ... - w có độ dài bé hơn đoạn s-w-v" và như vậy ta không thể chứng minh tiếp. Trong khi đó xét thuật toán floyd: "Để đi từ a --> B. 你失去了 1 距离为x. 该算法将找到 1 从间接的方式 — 到 — b和如果该路径是短直接路由,我们通过间接方式总是直接存取分配的最小值。” 由于找到合适的方式逐步间接头也不回喜欢的Dijkstra最短段应该是不会受到正面或负面的权重.
我的朋友问过自己,就是找到最短路径找到自己的方式与不同的最小重量游戏周边. 有一些重要的无论数量k的EH?
它在本质上是不同的,但我们认为这个问题几乎认真里程数是不是那么回事了.
当被问及自己找V + – 不?
V +- 什么是你?
我的朋友,你有算法代码FORD & 富尔克森证明不适用
我没有啊.
bạn có code c cho bài trên cho mình xin vf mình chưa học c++
Bài kia mình code c mà.
星èDijkstra算法运行代码段 1 返回故障停止工作的权利?? 回顾PES先生?
你检查错误是什么NHE.
噢,我的星星,你恰到好处这个错误
http://www.mediafire.com/view/aowfsuq6jpz5a0c/Loi.jpg
他们用vs阁阁C必须澄清代码.
显然,这个Java代码,你收集某些作家!
哪里有你的java本文中,您在COE? 😛 Và đảm bảo tất cả các code trong bài này và code Demo chương trình đồ họa bằng Java đều do tay mình viết. Nếu bạn thấy ở chỗ khác thì chỉ có họ copy của mình thôi. 😛 😛
军事优惠
Chỗ này code có vấn đề :
*G = (INT **) 的malloc((*ñ) * 的sizeof(INT));
修复: sizeof *int
*G = (INT **) 的malloc((*ñ) * 的sizeof(*INT));
Có thể bạn run trên Os 32 bit nên kết quả vẫn đúng, trên 64bit chắc là có vấn đề.
Mình chỉ đọc qua thôi chứ chưa debug :))
亲爱.
Ah rồi, mình có thấy lỗi. 🙂 cảm ơn bạn nhé.
a có thể mô phỏng thuật toán AT giúp e dc k?
AT la thuat toan gi the?
MÌnh vừa review code thì thấy 1 相当奇迹 :
您指定此代码:
INTñ, 该, B, 在, 总和= 0; // ==> 总和= 0 ;
为 (INT I = 0; 我莱恩[0] = 0 , 只[1] = 0 …. 只[N-1] = 0;
}
只[该] = 0;
// 这一段中间的无处重新分配莱恩[在] 我来自哪里跑 0 到n-1的 ;
//==> 只[0] = 0 , 只[1] = 0 …. 只[N-1] = 0;
为 (INT J = 0; Ĵ < ñ; J ) { // 混合晶体按日酸注释的长度
如果 (!S[Ĵ] && 只[在] + 摹[在][Ĵ] < 只[Ĵ]) {
只[Ĵ] =莱恩[在] + 摹[在][Ĵ]; // 要改变
??? 条件莱恩[在] + 摹[在][Ĵ] < 只[Ĵ] 不会发生不? 当 0 + 到 < 0 ?
审查代码NHE, 莱恩自己分配到初始金额在for循环
只[在] = SUM;
一个非常热烈。. 感谢您的文章
但是,为什么使用代码块MKķMK素食游客DC子程序声明早期,足量 .
Bạn nhìn xem nó báo lỗi gì nhé, dựa vào đó mới sửa được 🙂
Hay
sao mình chạy code nó báo là không tìm thấy file input là sao vậy ad, chỉ e với
你还记得文件相同的文件夹input.inp ZIP文件NHE.
a ơi cho e hỏi, 如果建立从矩阵图形,而直接从文件k,其中k一个读?
得到. 从文件中读取只读矩阵.
我运行的代码不能找到办法是
一个可以通过电子邮件发送完整的代码一个PES
例如,从1-方式>3 无法显示结果
一个可能的结果f预览演示一个PES
而且,他的代码运行标准. 在他的文章总是前还范例.
DC代码不能运行的最短路径回@例子: 1<-2<-3<-4
没有地方起始位置进入最终位置回
是在输入的第一行. 我读了所有NHE.
由PES file.txt的运行代码即可
此代码是通过输入导出文件运行.
pn ơi ! 自己问弗洛伊德算法 ! 不是如何经营自己的双手以及ZIP !
欢迎!
问问自己,在弗洛伊德算法
弗洛伊德无效 (一个INT, INT b)
{
INT最大= tongthiethai();
}
tongthiethai功能() 你的谎言在你的代码?
啊, 这个函数是和的函数[在][Ĵ] 反对, 在此我不写, 您可以写信给它. 只要使用 2 嵌套循环加上全部[在][Ĵ] 再次.
a có thể viết cụ thể cái hàm tongthiethai() giúp e dc ko ạ, Ck感谢
là hàm tính tổng tất cả a[在][Ĵ] 您.
贵重的
如果输入文件它作为一个矩阵K,也是它读取的代码找到最短路径的文件的地方是NTN他爵士. Ë谢谢, 一个代表帮助e为爵士.
文件名包含图
-第一行整数n表示顶点的数量
-下一行示出了每一个边缘, 1 边盖 3 整, 2 第一个数字代表图表的顶端, 的下一个数字表示的长度除, 用逗号分隔的数字.
见:
10
0,1,10
0,5,20
0,7,50
3,5,10
5,6,15
….
哥哥弟弟问输入文件的输入和输出出来它是什么,啊得到的地方
自我生成的输入文件, 由程序生成的输出文件基于输入文件的结果.
我哥哥的一个具有输入文件k所有AJH. K I知道在创建的输入文件 1 矩阵NTN先生
然后将该文件作为输入复制到终点.
bị lổi trong trong ham back -> dòng int point[ñ]; nội dung lổi mảng không truyền được
Dòng này là khai báo mảng thôi. 当然,你应该像VS代码上. 你可以用INT点更换[100];
Theo mãng A thì từ 8 -> 1 tốn chi phí là 10
Nhưng trace theo mãng P thì đi 8 -> 6 -> 3 -> 2 -> 1 với chi phí sẽ là 11, minh nghĩ đúng phải là 8-5-6-3-2-1 chứ nhỉ ?
欢迎, 我想知道VS几个问题不明白:
– 山顶开始是 4: 0
+ 4 -> 1: 2+0= 2
+ 4 -> 3: 4+0= 4
+ 4 -> 6: 3+0= 3
+ 4 -> 7: 6+0= 6
– 首脑会议 1: 2
+ 1 -> 2: 3+2= 5
+ 1 -> 3: 5+2= 7(未更新)
– 首脑会议 2: 5
+ 2 -> 5: 7+5= 12
+ 2 -> 3: 1+5= 6(未更新)
– 首脑会议 3: 4
+ 3 -> 6: 1+4= 5(未更新)
– 首脑会议 6: 3
+ 6 -> 8: 6+3= 9
到B = 8
Dijkstra算法读取功能是不理解的地方:
只[在] < LEN,该数组包含总和 [0,3,5,2] 在网上 0 与每一列 0,1,2,3 而每一列 5,6,7 它不计数是令人难以置信.
我感到困惑的文件输入矩阵阵列 2 维的线,所以我读列VS 2 循环中使用阵列 1 其尺寸不明白怎么
阅读他们的天代码不理解他的愿望来帮你解答. 请多关照
在运行莱恩的过程[在] 可以改变,所以我需要找到某些顶长度 < sum để đi tiếp. File đầu vào là mảng 2 chiều, mình đọc vào G rồi, làm gì có chỗ nào đọc bằng mảng 1 chiều đâu bạn.
找到的位置中评论说,这不是重点具有非常VS已经使用长度min的S- VS莱恩维数组找到位置,但仍经历 8 但在峰值输入阵列 2 晚. 对于我的功能,我觉得非常检索每个小峰时,他的下巴对于j不误读, 只[在] VS爱尔兰[Ĵ] 为峰值或峰值VS连接你. 他纠结…
在阐述他的算法,我有你. 使用 1 莱恩阵列[] - 莱恩[在] 是从一个顶点的最短距离到顶点我.
谢谢, 我看了,但没有误读. 要查看自己找清晰度的视频
Cho xem xin code chương trình xây dựng thụật toán Floyd với ạ. 谢谢!
Có code ở trên rồi nhé.
ko bít anh có làm video nào nói về thuật toán dijkstra ko ạ… tại em sắp thi HSG tin mà khi lên mạng tìm hỉu thì vẫn chưa hỉu lắm ạ… mog a giúp đỡ cho
Mình chỉ có bài viết này thôi.
code dau tien mình chay nhung ko ra duoc output
Bạn phải có input từ file nhé.
cho e hỏi cái hàm Tongthiethai() trong phần code của Floyd viết sao v ạ
服务员, cho em hỏi là thuật toán floyd ở trên là dùng Phương pháp gì vậy ạ.
quy hoạch động hay quay lui hay vet cạn?