最小生成树入门题,和纯粹的裸题有些区别,题目中有些道路已经存在,不需要建造,答案是求最后建造的总费用,不要把已经有的道路的权值算进去

//kruskal算法已有的边权植赋为0
//用SORT排序,用并查集判断是否成环

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define INF 1236343242
#define MAX 110
bool vis[MAX][MAX];
int p[MAX];
int ans[MAX*MAX];struct edge
{int b,e,w;
}a[MAX*MAX];
int n;int cmp(struct edge p , struct edge q)
{return p.w<q.w;
}int find(int x)
{return p[x]==x ? x : p[x]=find(p[x]);
}
void kruskal()
{int x,y,i,j,k,count;int sum;for(i=1; i<=n; i++)p[i]=i;for(sum=0,i=1; i<=n; i++){x=find(a[i].b);y=find(a[i].e);if(x!=y){p[x]=y;sum+=a[i].w;}}printf("%d\n",sum);return ;
}
void init()
{int i,j,t;for(i=1; i<=n; i++){scanf("%d%d%d%d",&a[i].b,&a[i].e,&a[i].w,&t);if(t)a[i].w=0;   //权值改为0
    }
}
int main()
{int i,j,t;while(scanf("%d",&n)!=EOF && n){n=n*(n-1)/2;init();sort(a+1 , a+n+1 , cmp);kruskal();}return 0;
}

//Prim算法实现

#include <stdio.h>
#include <string.h>
#define MAX 110
#define INF 1232145125
bool vis[MAX][MAX];
int G[MAX][MAX];
int adj[MAX];
int lowcoat[MAX];
int n;void init()
{int i,j,a,b,c,d;memset(vis , 0 ,sizeof(vis));for(i=0; i<=n; i++)for(j=0; j<=n; j++)G[i][j]=INF;for(i=0; i<=n; i++)G[i][i]=0;for(i=1; i<=n*(n-1)/2; i++){scanf("%d%d%d%d",&a,&b,&c,&d);G[a][b]=G[b][a]=c;if(d){vis[a][b]=vis[b][a]=1;G[a][b]=G[b][a]=-1;  //已经有的道路我们假设它的权值为-1}
//        printf("G[%d][%d]=G[%d][%d]=%d\n",a,b,b,a,G[a][b],G[b][a]);
    }
}void prim()
{int v,i,j,k,min,ans;for(i=1; i<=n; i++){adj[i]=1;lowcoat[i]=G[1][i];}lowcoat[1]=0;for(v=1; v<n; v++){min=INF; k=1;for(i=1; i<=n; i++)if(lowcoat[i] && lowcoat[i]<min){min=lowcoat[i];k=i;}lowcoat[k]=0;
//        printf("min=%d\n",min);
//        printf("k=%d\n",k);for(i=1; i<=n; i++)if(lowcoat[i] && G[k][i]<lowcoat[i]){lowcoat[i]=G[k][i];adj[i]=k;}}//    printf("lowcoat:  ");
//      for(i=1; i<=n; i++) printf("%d ",lowcoat[i]); printf("\n");
//    printf("adj:  ");
//      for(i=1; i<=n; i++) printf("%d ",adj[i]);     printf("\n");for(ans=0,v=2; v<=n; v++){i=adj[v];if(G[i][v]!=-1)  //如果这条路本身存在则不要算它的费用,不存在的才要算ans+=G[i][v];}printf("%d\n",ans);
}
int main()
{while(scanf("%d",&n)!=EOF && n){init();prim();}return 0;
}

转载于:https://www.cnblogs.com/scau20110726/archive/2012/10/10/2719204.html

hdu 1879 继续畅通工程相关推荐

  1. hdu 1879 继续畅通工程 最小生成树

    继续畅通工程                                                                             Time Limit: 2000/ ...

  2. hdu 1879 继续畅通工程 (最小生成树)

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. HDU 1879 继续畅通工程 最小生成树

    继续畅通工程 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description ...

  4. HDU - 1879 继续畅通工程 【最小生成树 - 升级】

    Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任 ...

  5. hdu 1879 继续通畅工程(最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1879 /************************************************* ...

  6. HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)

    原题地址 http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可 ...

  7. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  8. HDU 1233 还是畅通工程(最小生成树)

    传送门 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  9. 【HDU - 1863】 畅通工程(并查集+最小生成树)

    题干: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的 ...

最新文章

  1. 【Robot学院】一文读懂世界智能制造大趋势!
  2. 享有的意思是_“fuck you money”不是“x你钱”,真实意思却是这个
  3. javaMail操作QQ邮箱发送邮箱 Demo
  4. COGS 36. 求和问题
  5. SLF4J with Logback in a Maven Project | Mograblog
  6. 浅谈OpenCL之Platform API(2)
  7. [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?
  8. JS取得RadioButtonList的Value,Text及选中值等信息
  9. objC 类名后圆括号的意义
  10. 用命令提示符使用MySQL
  11. sla java_Grafana中滑动窗口的Prometheus正常运行时间或SLA百分比
  12. java 计算百分比 保留两位小数
  13. JEOL:发布新的扫描电子显微镜JSM-IT700HR
  14. 基于马尔科夫链的关于CpG岛的模式识别分类学习器
  15. 一文教你秒懂晶体三极管与场效应晶体管选型的诀窍
  16. echarts报错 Unkown series surface
  17. FLIR E85/E95/T620/t610/T540/T530红外热像仪全齐
  18. c语言冒泡排序法代码(c语言冒泡排序法代码讲解)
  19. html上传文件时选取多文件
  20. 录音完成上传文件失败

热门文章

  1. ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
  2. 一个分析“文件夹”选择框实现方法的过程
  3. 深度学习中的优化算法之MBGD
  4. CUDA Samples: Streams' usage
  5. C++11中nullptr的使用
  6. Ubuntu下内存泄露检测工具Valgrind的使用
  7. Artistic Style在windows下的使用(C/C++)
  8. OpenCV像素点处理
  9. 【视频】使用VLC采集摄像头,以RTSP协议发送流到网络上
  10. android 反编译_Box 黑科技——支持手机端反编译