HDU1102 Constructing Roads 最小生成树prim||kruskal
来源:互联网 发布:sai绘图软件中文版 编辑:程序博客网 时间:2024/05/18 03:57
题目链接:HDU1102
很裸的题目,下面给出prim算法和kruskal算法解题代码,直接套模板即可。
AC代码:
prim()算法
/*2017年8月28日15:57:26HDU1102最小生成树 prim算法AC */#include <iostream>//#include <map>#include <set>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>#include <vector> using namespace std;const int inf=1<<29;const int maxn=110;bool vis[maxn]; int dis[maxn]; int map[maxn][maxn];int n,a,b,q; void prim(){ int i,j,k,tmp,ans=0; for(i=1;i<=n;i++){ dis[i]=inf;//初始化 vis[i]=false;} dis[1]=0; for(i=1;i<=n;i++){ tmp=inf; for(j=1;j<=n;j++){ if(!vis[j]&&tmp>dis[j]){ tmp=dis[j]; k=j; }//找出最小距离的节点 } ans+=dis[k]; vis[k]=1;//把访问的节点做标记 for(j=1;j<=n;j++){ if(!vis[j]&&dis[j]>map[k][j]) dis[j]=map[k][j];//更新最短距离 } } printf("%d\n",ans);} void init(int n){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&map[i][j]);}}scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%d%d",&a,&b);map[a][b]=map[b][a]=0;}} void solve(){prim();}int main(){while(~scanf("%d",&n)){init(n);solve();}return 0;}
/*2017年8月28日21:05:19HDU1102最小生成树kruskal算法 AC*/#include <iostream>#include <map>#include <set>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>#include <vector> using namespace std;const int maxn=1e4+10;struct node{int u,v,w;void init(){u=v=w=0;}}edge[maxn];int pre[maxn];int n,w,num,a,b,q;void addedge(int u,int v,int w){edge[num].u=u;edge[num].v=v;edge[num].w=w;num++; } bool cmp(node a,node b){return a.w<b.w;}int find(int x){ int r=x; while(pre[r]!=r) r=pre[r];//查找到根节点为止 int i=x,j; while(i!=r){ j=pre[i]; pre[i]=r; i=j; } return r; }int kruskal(int n){int ans=0;//int cnt=0;sort(edge,edge+num,cmp);for(int i=0;i<num;i++){int u=edge[i].u;int v=edge[i].v;int w=edge[i].w;u=find(u);v=find(v);if(u!=v){ans+=w;pre[v]=u;//cnt++;}}return ans;}void init(){for(int i=1;i<=maxn;i++) edge[i].init();for(int i=1;i<=n;i++) pre[i]=i;num=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&w);if(i>=j) continue;else addedge(i,j,w);}}scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%d%d",&a,&b);a=find(a);b=find(b);pre[b]=a;}}void solve(){printf("%d\n",kruskal(n)); }int main(){while(~scanf("%d",&n)){init();solve();}return 0;}
阅读全文
0 0
- hdu1102 - Constructing Roads (求最小生成树) (Prim & Kruskal)
- HDU1102 Constructing Roads 最小生成树prim||kruskal
- hdu1102 Constructing Roads 最小生成树+prim
- hdu1102 Constructing Roads 最小生成树Prim
- hdu1102 Constructing Roads 最小生成树Prim
- HDU1102 Constructing Roads 【最小生成树Prim】
- hdu1102(Constructing Roads)--prim最小生成树
- hdu1102 Constructing Roads--最小生成树prim
- hdu1102 Constructing Roads (最小生成树,kruskal)
- hdu1102 Constructing Roads (最小生成树 prim 算法)
- HDU1102-Constructing Roads-最小生成树(prim模板题)
- hdu1102 Constructing Roads(最小生成树) prim
- HDU1102 Constructing Roads(最小生成树Prim算法)
- HDU1102 Constructing Roads 最小生成树
- Hdu1102 - Constructing Roads - 最小生成树
- HDU1102 Constructing Roads(最小生成树)
- HDU1102 Constructing Roads(最小生成树)
- HDU1102 Constructing Roads 最小生成树
- 二叉树编程专题--查找最低公共父节点
- [C 语言]判断某文件是文件夹还是文件
- SQL 排序查询
- 快速排序算法
- 巧妙转换复杂数据的格式
- HDU1102 Constructing Roads 最小生成树prim||kruskal
- 2.S5PV210中PWM定时器2控制蜂鸣器
- 华为笔试:进制转换
- 【shiro】--- 集成web
- java中的容器变量
- 2075最少拦截系统
- InnoDB undo log解析(一)
- 从面向过程到面向对象
- QAbstractItemModel使用样例与解析