怎么硕呢
这俩肯定是一个人抄了另一个人的代码。就在花费那一部分 一个是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();}