hdu 3371 Connect the Cities 最小生成树prim
2016-04-29 15:42
417 查看
题目链接
题意:给出n个城市,m条路,k组互相还连通的城市,求使城市连通的最小的代价。
k组城市之间不需要两两距离赋为0,只需建立n-1条距离为0的路即可。
题意:给出n个城市,m条路,k组互相还连通的城市,求使城市连通的最小的代价。
k组城市之间不需要两两距离赋为0,只需建立n-1条距离为0的路即可。
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 550 #define INF 0x7ffffff using namespace std; int d ,v ,mp ,n; int prim() { for(int i=1;i<=n;i++) d[i]=INF,v[i]=0; d[1]=0; for(int i=0;i<n;i++) { int mmin=INF,t=-1; for(int j=1;j<=n;j++) if(!v[j]&&d[j]<mmin) mmin=d[t=j]; v[t]=1; if(t==-1) return -1; for(int j=1;j<=n;j++) if(!v[j]) d[j]=min(d[j],mp[t][j]); } int ans=0; for(int i=1;i<=n;i++) ans+=d[i]; return ans; } int main() { int T,m,k; cin>>T; while(T--) { cin>>n>>m>>k; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[i][j]=INF; for(int i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); if(mp[u][v]>w) mp[u][v]=mp[v][u]=w; } for(int i=0;i<k;i++) { int t,u,v; scanf("%d",&t); for(int j=0;j<t;j++) { scanf("%d",&u); if(j) mp[u][v]=mp[v][u]=0; v=u; } } cout<<prim()<<endl; } }
相关文章推荐
- Mac系统如何编辑hosts文件
- setDefaultAlphaPixelFormat bug addSpriteFrames 异步加载资源
- Bitmap的加载和Cache————读书笔记
- [精]Oracle 内存结构详解
- Unity5打包assetbundle
- Java Web 与 QtQuick
- 实验三 进程调度模拟程序
- Linux内核分析——Linux内核学习总结
- 集合框架(用LinkedList模拟栈数据结构的集合并测试案例)
- CentOS虚拟机中安装VMWare Tools
- 调试器工作原理(1):基础篇
- 【Leetcode】:96. Unique Binary Search Trees 问题 in Go语言
- 面试题12
- Light oj 1140 - How Many Zeroes? 数位dp
- Maven项目有工程报错,但是不影响运行
- 传统的错误处理方法
- java集合迭代器Iterator中的remove陷阱
- js 弹出确认 取消对话框
- Java多线程之synchronized和volatile
- nyoj_62 笨小熊