300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > (迪杰斯特拉)Dijkstra算法 与 普里姆算法(Prim算法)

(迪杰斯特拉)Dijkstra算法 与 普里姆算法(Prim算法)

时间:2018-12-17 06:42:23

相关推荐

(迪杰斯特拉)Dijkstra算法 与 普里姆算法(Prim算法)

怎么硕呢

这俩肯定是一个人抄了另一个人的代码。就在花费那一部分 一个是d[u] = mp[u][v]+d[v] (迪杰斯特拉) 另一个是d[u] = mp[u][v]

大体思路就是一直找和以之节点相通的节点之间最省钱的路径就完了。

相比较克鲁斯卡尔来说,一个是以点展开验证边。而克鲁斯卡尔是以边为展开看连接点点是否属于都一个跟(并查集)

迪杰斯特拉:

#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3f//测试样例//4 6//1 2 1 //1 3 4 //1 4 1 //2 3 3 //2 4 2 //3 4 5 int vis[100];int money[100][100];int n;void Dijkstra(int x){int v,u;int d[100];int p[100];memset(d,INF,sizeof(d));memset(vis,0,sizeof(vis));memset(p,-1,sizeof(p));d[x]=0;while(1){u=-1;int minv=INF;for(int i=0;i<n;i++){if(d[i]<minv&&vis[i]!=1){minv=d[i];u=i;}}if(u==-1) break;vis[u]=1;for(v=0;v<n;v++){if(money[u][v]!=INF&&vis[v]!=1){if(d[v]>money[u][v]+d[u]){d[v]=money[u][v]+d[u];p[v]=u;}}}}int sum=0;for(int i=0;i<n;i++){if(x==i) continue;printf("Dijkstra算法:%d点到%d点的最小花费为%d\n",x,i,d[i]); }}int main(){int i,j,m;scanf("%d %d",&n,&m);memset(money,INF,sizeof(money));for(i=0;i<m;i++){int x,y,z;scanf("%d %d %d",&x,&y,&z);money[x-1][y-1]=z;money[y-1][x-1]=z;}for(i=0;i<n;i++){printf("当出发点是%d时,到各个点的花费:\n",i); Dijkstra(i);}}

普利姆:

#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3f//测试样例//4 6//1 2 1 1//1 3 4 0//1 4 1 1//2 3 3 0//2 4 2 1//3 4 5 0 int vis[100];int money[100][100];int n;void prim(){int v,u;int d[100];int p[100];memset(d,INF,sizeof(d));memset(vis,0,sizeof(vis));memset(p,-1,sizeof(p));d[0]=0;while(1){u=-1;int minv=INF;for(int i=0;i<n;i++){if(d[i]<minv&&vis[i]!=1){minv=d[i];u=i;}}if(u==-1) break;vis[u]=1;for(v=0;v<n;v++){if(money[u][v]!=INF&&vis[v]!=1){if(d[v]>money[u][v]){d[v]=money[u][v];p[v]=u;}}}}int sum=0;for(int i=0;i<n;i++){if(p[i]!=-1) sum=sum+money[i][p[i]];}printf("prim算法:最小花费为%d",sum); }int main(){int i,j,m;scanf("%d %d",&n,&m);memset(money,INF,sizeof(money));for(i=0;i<m;i++){int x,y,z;scanf("%d %d %d",&x,&y,&z);money[x-1][y-1]=z;money[y-1][x-1]=z;}prim();}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。