题目链接

就是裸的最小生成树,复习一下。

prim算法:

G=(V,E),V是点集,E是边集

假设T=(U,TE)是最小生成树。U,TE初始化为空

首先从V中任取一点 假设取V1,然后U={V1},只要U是V的真子集,就从那些一个端点在T中,一个端点在T外的边中,找一条最短边。一直下去,直到找到n-1条边

找边使用 堆优化,复杂度(ElogV) 邻接表复杂度(V2

  1. #include<cstdio>
  2. #include<vector>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. const int maxn=;
  7. const int inf=0x3f3f3f3f;
  8.  
  9. struct node{
  10. int v,dis;
  11. node(){}
  12. node(int _v,int _dis){
  13. v=_v;
  14. dis=_dis;
  15. }
  16. bool operator<(const node &b) const {
  17. return dis>b.dis;
  18. }
  19. };
  20.  
  21. int n,dis[maxn];
  22. vector<node> G[maxn];
  23. bool vis[maxn];
  24.  
  25. void prim() {
  26. int ans=,num=;
  27. priority_queue<node> pq;
  28. for(int i=;i<n;i++) {
  29. vis[i]=false;
  30. dis[i]=inf;
  31. }
  32. pq.push(node(,));
  33. node f;
  34. while(num<n&&!pq.empty()) {
  35. do{
  36. f=pq.top();
  37. pq.pop();
  38. }while(vis[f.v]&&!pq.empty());
  39. if(!vis[f.v]) {
  40. ans+=f.dis;
  41. vis[f.v]=true;
  42. num++;
  43. for(int i=;i<G[f.v].size();i++) {
  44. int v=G[f.v][i].v;
  45. if(!vis[v]) {
  46. if(dis[v]>G[f.v][i].dis) {
  47. dis[v]=G[f.v][i].dis;
  48. pq.push(node(v,dis[v]));
  49. }
  50. }
  51. }
  52. }
  53. }
  54. if(num<n) printf("-1\n");//因为这里记录的是点的个数。不是边
  55. else printf("%d\n",ans);
  56. }
  57.  
  58. int main() {
  59. while(~scanf("%d",&n)) {
  60. memset(G,,sizeof(G));
  61. for(int i=;i<n;i++) {
  62. for(int j=;j<n;j++) {
  63. int x;
  64. scanf("%d",&x);
  65. if(x) G[i].push_back(node(j,x));
  66. }
  67. }
  68. prim();
  69. }
  70. }

krusual算法:

将图G中的边按权值从小到大选取,使选取的不与生成树构成回路。直到n-1条边为止

判断回路就用并查集搞一下。

  1. #include<cstdio>
  2. #include<vector>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn=;
  8. const int inf=0x3f3f3f3f;
  9.  
  10. int n;
  11. struct Edge{
  12. int u,v,dis;
  13. Edge(){}
  14. Edge(int _u,int _v,int _dis) {
  15. u=_u;
  16. v=_v;
  17. dis=_dis;
  18. }
  19. bool operator <(const Edge &b) const {
  20. return dis<b.dis;
  21. }
  22. };
  23.  
  24. vector<Edge> edge;
  25.  
  26. int fa[maxn];
  27.  
  28. int Find(int x) {
  29. if(fa[x]==-) return x;
  30. else return fa[x]=Find(fa[x]);
  31. }
  32.  
  33. void Union(int x,int y) {
  34. int fx=Find(x);
  35. int fy=Find(y);
  36. if(fx!=fy) {
  37. fa[fx]=fy;
  38. }
  39. }
  40.  
  41. int main() {
  42. while(~scanf("%d",&n)) {
  43. memset(fa,-,sizeof(fa));
  44. edge.clear();
  45. for(int i=;i<n;i++) {
  46. for(int j=;j<n;j++) {
  47. int x;
  48. scanf("%d",&x);
  49. if(x&&j<i) edge.push_back(Edge(i,j,x));
  50. }
  51. }
  52. sort(edge.begin(),edge.end());
  53. int num=,ans=;
  54. for(int i=;i<edge.size();i++) {
  55. int u=edge[i].u,v=edge[i].v,dis=edge[i].dis;
  56. if(Find(u)!=Find(v)) {
  57. num++;
  58. ans+=dis;
  59. Union(u,v);
  60. }
  61. }
  62. if(num==n-) printf("%d\n",ans);
  63. else printf("-1\n");
  64. }
  65. }

POJ1358 Agri-Net的更多相关文章

  1. Agri Net POJ1258 && Constructing Roads POJ2421

    题意,在给出的图中,使用最小花费的边,使这个图仍然连通. #include <cstdio> #include <algorithm> #include <cstring ...

  2. UI中经常出现的下拉框下拉自动筛选效果的实现

    小需求是当你在第一个下拉框选择了国家时,会自动更新第二个省份的下拉框,效果如下 两个下拉选择Html如下: <select id="country_select"> & ...

  3. 告别无止境的增删改查:Java代码生成器

    对于一个比较大的业务系统,我们总是无止境的增加,删除,修改,粘贴,复制,想想总让人产生一种抗拒的心里.那有什么办法可以在正常的开发进度下自动生成一些类,配置文件,或者接口呢?   有感于马上要做个比较 ...

  4. A过的题目

    1.TreeMap和TreeSet类:A - Language of FatMouse ZOJ1109B - For Fans of Statistics URAL 1613 C - Hardwood ...

  5. 告别无止境的增删改查--Java代码生成器

    转自:http://www.cnblogs.com/zhuYears/archive/2012/02/29/2373491.html 告别无止境的增删改查--Java代码生成器 有感于马上要做个比较大 ...

  6. 网络-05-端口号-F5-负载均衡设-linux端口详解大全--TCP注册端口号大全备

    [root@test1:Standby] config # [root@test1:Standby] config # [root@test1:Standby] config # [root@test ...

  7. Mybatis中 Integer 值为0时,默认为空字符串的解决办法。

    需求是查询级别为0的用户 User对象里的level字段的值为0,查询时居然没有查到为level为0的用户. <select id="selectSelective" par ...

  8. CentOS 7 服务端口表

    # Note that it is presently the policy of IANA to assign a single well-known# port number for both T ...

  9. etymon word air aero aeri aer ag agreement walk joint trick skill chief forget out~1

      1● air 2● aero 3● aeri 4● aer 空气 充气       1● ag     做,代理做   =====>agency       1● agr 2● agri 3 ...

随机推荐

  1. Hadoop之HDFS(三)HDFS的JAVA API操作

    HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...

  2. day63-webservice 03.解析cxf提供的例子

    Path配置: C:\Program Files (x86)\ScanSign;E:\app\zhongzh\product\11.2.0\dbhome_1\bin;D:\app\zhongzh\pr ...

  3. mongo_2 $in 和 $all 区别

    in 只需满足( )内的某一个值即可, 而$all 必须满足[ ]内的所有值, > db.table1.find({}); { "_id" : ObjectId(" ...

  4. Asp.Net程序目录下文件夹或文件操作导致Session失效的解决方案

    1.配置web.config <system.web> <sessionState mode="StateServer" stateConnectionStrin ...

  5. post get 方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  6. ASP.NET MVC Controller 编程所涉及到的常用属性成员

    Controller (System.Web.Mvc.Controller) 1.获取路由中的各个值 Request.RequestContext.RouteData.Values["id& ...

  7. SQL 全角半角转换-(摘抄)

    /****** SQL转换全角/半角函数 开始******/ CREATE FUNCTION ConvertWordAngle ( @str NVARCHAR(4000), --要转换的字符串 @fl ...

  8. html5 video使用autoplay属性时,声音混乱

    html5 video使用autoplay属性时,声音混乱 页面代码 Index.html <html xmlns="http://www.w3.org/1999/xhtml" ...

  9. WebStrom背景色设置

    Ctrl Alt S快速打开setting:

  10. 和Webbrowser进行简单交互

    作为第一篇,简单的控件使用就不说了. 直接从简单的交互开始吧! C#使用网页中已有的js函数 webBrowser.Document.InvokeScript("Stop");// ...