最小生成树prime算法(和Dijkstra算法很类似,除了下面有个地方不同)

来源:互联网 发布:哪个软件可以订民宿 编辑:程序博客网 时间:2024/05/16 02:06
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <string.h>#include <queue>     //poj1258 最小生成树prime算法(和Dijkstra算法很类似,除了下面有个地方不同)#include <vector>#define inf 10000000using namespace std;  int n, vis[110], dis[110], map[110][110];int prime(){int t, j, k, min, sum=0;memset(vis, 0, sizeof(vis));for(t=0; t<n; ++t){dis[t]=map[0][t];}vis[0]=1;for(j=1; j<n; ++j)  //注意,这里少一次循环,因为前面已经选了一个点{min=inf;for(t=0; t<n; ++t){if(!vis[t]&&dis[t]<min){k=t;min=dis[t];}}vis[k]=1;sum+=min;for(t=0; t<n; ++t){if(!vis[t]&&dis[t]>map[k][t])//这里就是和Dijkstra算法不同的地方,Dijkstra算法是时刻和那个单源点相连,而这里保证图联通且权值最小dis[t]=map[k][t];}}return sum;}int main(){int t, j, s;while(scanf("%d", &n)!=EOF){for(j=0; j<n; ++j){for(t=0; t<n; ++t){scanf("%d", &map[j][t]);}}s=prime();printf("%d\n", s);}return 0;}




#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <string.h>#include <queue>     //poj2485 最小生成树prime算法---只是在求最小生成树的过程中记录最大的边#include <vector>#define inf 100000000using namespace std;  int n, g, vis[510], dis[510], map[510][510];void prime(){int t, j, k, min, sum=0;memset(vis, 0, sizeof(vis));for(t=0; t<n; ++t){dis[t]=map[0][t];}g=0;vis[0]=1;for(j=1; j<n; ++j)  //注意,这里少一次循环,因为前面已经选了一个点{min=inf;for(t=0; t<n; ++t){if(!vis[t]&&dis[t]<min){k=t;min=dis[t];}}vis[k]=1;if(g<min)g=min;sum+=min;for(t=0; t<n; ++t){if(!vis[t]&&dis[t]>map[k][t])//这里就是和Dijkstra算法不同的地方,Dijkstra算法是时刻和那个单源点相连,而这里保证图联通且权值最小dis[t]=map[k][t];}}return ;}int main(){int t, j, T;scanf("%d", &T);while(T--){scanf("%d", &n);for(j=0; j<n; ++j){for(t=0; t<n; ++t){scanf("%d", &map[j][t]);}}prime();printf("%d\n", g);}return 0;}




原创粉丝点击