数据结构总结之最小生成树
来源:互联网 发布:手机上编写c语言的软件 编辑:程序博客网 时间:2024/06/06 06:19
1.kruskal:
#include <stdio.h>#include <stdlib.h>#include <algorithm>#define N 150using namespace std;int m,n,u[N],v[N],w[N],p[N],r[N];//r是边的编号//p是点的祖先点(便于判断是否在同一连通图)int cmp(const int i,const int j){ return w[i]<w[j];}int find(int x){ return p[x]==x?x:p[x]=find(p[x]);}int kruskal(){ int cou=0,x,y,i,ans=0; for(i=0; i<n; i++) p[i]=i; for(i=0; i<m; i++) r[i]=i; sort(r,r+m,cmp); for(i=0; i<m; i++) { int e=r[i]; x=find(u[e]); y=find(v[e]); if(x!=y) { ans += w[e]; p[x]=y; cou++; } } if(cou<n-1) ans=0; return ans;}int main(){ int i,ans; while(scanf("%d%d",&m,&n)!=EOF&&m) { for(i=0; i<m; i++) { scanf("%d%d%d",&u[i],&v[i],&w[i]); } ans=kruskal(); if(ans) printf("%d\n",ans); else printf("?\n",ans); } return 0;}
2.遍历所有节点,求最小的路径最大值:
uva544
prim:
#include <iostream>#include <stdio.h>#include <string.h>#include <string>#include <map>#include <algorithm>using namespace std;int m,n,t;int e,b;int map_ [210][210];bool vis[210];int dis[210];map <string,int> ma;void dj(){ for(int i=1;i<=n;i++) dis[i]=map_[b][i]; dis[b]=0; vis[b]=1; for(int i=0;i<n;i++) { int temp=-1; int v=-1; for(int j=1;j<=n;j++) { if(temp<dis[j] && !vis[j]) { temp=dis[j]; v=j; } } if(v==-1) return ; vis[v]=1; for(int j=1;j<=n;j++) if(!vis[j] && map_[v][j] && dis[j]<min(dis[v],map_[v][j])) dis[j]=min(dis[v],map_[v][j]); }}int main(){ int count_=0; while(cin>>n>>m && !(n==0 && m==0)) { t=1; count_++; ma.clear(); memset(map_,0,sizeof(map_)); memset(vis,0,sizeof(vis)); for(int i=0;i<m;i++) { string s1,s2; int ton; cin>>s1; if(!ma.count(s1)) ma[s1]=t++; cin>>s2; if(!ma.count(s2)) ma[s2]=t++; cin>>ton; int x=ma[s1]; int y=ma[s2]; map_[x][y]=ton; map_[y][x]=ton; } string s1,s2; cin>>s1>>s2; b=ma[s1]; e=ma[s2]; dj(); cout<<"Scenario #"<<count_<<endl<<dis[e]<<" tons"<<endl<<endl; } return 0;}
kruskal:
#include <cstdio> #include <cstring> #include <string> #include <map> #include <iostream> #include <algorithm> using namespace std; const int N = 205; const int M = 20005; map<string, int> hash; string a, b; int hn; int get(string a) { if (!hash.count(a)) hash[a] = hn++; return hash[a]; } struct Edge { int u, v, val; void read() { cin >> a >> b >> val; u = get(a); v = get(b); } } e[M]; bool cmp(Edge a, Edge b) { return a.val > b.val; } int n, m, parent[N]; int find(int x) { return x == parent[x] ? x : parent[x] = find(parent[x]); } int main() { int cas = 0; while (~scanf("%d%d", &n, &m) && n || m) { string a, b, val; hash.clear(); hn = 1; for (int i = 1; i <= n; i++) parent[i] = i; for (int i = 0; i < m; i++) e[i].read(); sort(e, e + m, cmp); cin >> a >> b; int ss = get(a), ee = get(b); for (int i = 0; i < m; i++) { int pu = find(e[i].u); int pv = find(e[i].v); if (pu != pv) { parent[pu] = pv; if (find(ss) == find(ee)) { printf("Scenario #%d\n", ++cas); printf("%d tons\n\n", e[i].val); break; } } } } return 0; }
阅读全文
0 0
- 数据结构总结之最小生成树
- 数据结构之最小生成树
- 数据结构之 最小生成树
- 数据结构之最小生成树
- 数据结构之最小生成树
- 数据结构之最小生成树
- 数据结构之最小生成树
- 数据结构之最小生成树
- C++数据结构之最小生成树
- 数据结构之 图的最小生成树
- 白话数据结构之【最小生成树】
- 数据结构之最小生成树prim算法
- 数据结构之最小生成树 Kruskal算法
- 数据结构之(prim)最小生成树
- 《数据结构和算法》之最小生成树
- 数据结构实验之图论九:最小生成树
- 数据结构实验之图论九:最小生成树
- 数据结构实验之图论九:最小生成树
- Java后台生成验证码图片
- ionic build android 中解决下载慢的资源
- git提交代码
- Ubuntu16安装chrome
- 《极客与团队》【PDF】下载
- 数据结构总结之最小生成树
- maven+Spring+SpringMVC+Mybatis+MySQL+tomcat环境搭建
- 关于SD卡的路径在4.0和5.0、6.0不同的问题
- Yii视图添加资源文件在所有资源文件的下面
- Writable的实现
- 敏感信息泄漏
- js读取上传的文件内容
- YOLOv2源码分析(二)
- zookeeper和dubbo的关系【转】