HDU - 1863 畅通工程(最小生成树)
2015-12-03 21:22
337 查看
d.m个村庄,n条路,计算出所有村庄畅通需要的最低成本。
s.最小生成树
c.Prim算法:cost[a][b]和cost[b][a]都得赋值。
View Code
s.最小生成树
c.Prim算法:cost[a][b]和cost[b][a]都得赋值。
/* Kruskal算法 Kruskal算法求MST */ #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MAXN=110;//最大点数 const int MAXM=10000;//最大边数 int F[MAXN];//并查集使用 struct Edge{ int u,v,w; }edge[MAXM];//存储边的信息,包括起点/终点/权值 int tol;//边数,加边前赋值为0 void addedge(int u,int v,int w){ edge[tol].u=u; edge[tol].v=v; edge[tol++].w=w; } //排序函数,将边按照权值从小到大排序 bool cmp(Edge a,Edge b){ return a.w<b.w; } int find(int x){ if(F[x]==-1)return x; else return F[x]=find(F[x]); } //传入点数,返回最小生成树的权值,如果不连通返回-1 int kruskal(int n){ memset(F,-1,sizeof(F)); sort(edge,edge+tol,cmp); int cnt=0;//计算加入的边数 int ans=0; for(int i=0;i<tol;i++){ int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; int t1=find(u); int t2=find(v); if(t1!=t2){ ans+=w; F[t1]=t2; cnt++; } if(cnt==n-1)break; } if(cnt<n-1)return -1;//不连通 else return ans; } int main(){ int N,M; int u,v,w; while(~scanf("%d",&N)){ if(N==0)break; scanf("%d",&M); tol=0; for(int i=0;i<N;++i){ scanf("%d%d%d",&u,&v,&w); --u;--v; addedge(u,v,w); } int ans=kruskal(M); if(ans==-1)printf("?\n"); else printf("%d\n",ans); } return 0; }
View Code
相关文章推荐
- win32获取和设置本地已经存在的网站的cookie
- Codeforces 601A The Two Routes(暴力)
- cannot verify client.(3000)
- IOS C语言 函数
- 爬爬爬之路:UI(十四) 网络请求
- nyoj 290
- libsvm的使用
- MStar之公司简介
- OC基础(23)
- hdu 4287 Intelligent IME
- 南大软院大神养成计划--网站
- 同步集合
- noip2015pj t4
- scanf
- PHP基础--变量
- badusb_payload(一)添加管理员用户
- 栈的数组实现
- java设计模式(五)--策略模式
- Linux内核同步机制之(七):RCU基础
- 将WAR包部署在tomcat根路径