蓝桥杯 城市建设 (最小生成树)卡鲁斯卡尔
2016-03-19 11:33
239 查看
历届试题 城市建设
时间限制:1.0s 内存限制:256.0MB
问题描述
栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修。市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他。
C市中有n个比较重要的地点,市长希望这些地点重点被考虑。现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点。另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接。
栋栋拿到了允许建设的道路的信息,包括每条可以建设的道路的花费,以及哪些地点可以建设码头和建设码头的花费。
市长希望栋栋给出一个方案,使得任意两个地点能只通过新修的路或者河道互达,同时花费尽量小。
输入格式
输入的第一行包含两个整数n, m,分别表示C市中重要地点的个数和可以建设的道路条数。所有地点从1到n依次编号。
接下来m行,每行三个整数a, b, c,表示可以建设一条从地点a到地点b的道路,花费为c。若c为正,表示建设是花钱的,如果c为负,则表示建设了道路后还可以赚钱(比如建设收费道路)。
接下来一行,包含n个整数w_1, w_2, …, w_n。如果w_i为正数,则表示在地点i建设码头的花费,如果w_i为-1,则表示地点i无法建设码头。
输入保证至少存在一个方法使得任意两个地点能只通过新修的路或者河道互达。
输出格式
输出一行,包含一个整数,表示使得所有地点通过新修道路或者码头连接的最小花费。如果满足条件的情况下还能赚钱,那么你应该输出一个负数。
样例输入
5 5
1 2 4
1 3 -1
2 3 3
2 4 5
4 5 10
-1 10 10 1 1
样例输出
9
样例说明
建设第2、3、4条道路,在地点4、5建设码头,总的花费为9。
数据规模和约定
对于20%的数据,1<=n<=10,1<=m<=20,0<=c<=20,w_i<=20;
对于50%的数据,1<=n<=100,1<=m<=1000,-50<=c<=50,w_i<=50;
对于70%的数据,1<=n<=1000;
对于100%的数据,1 <= n <= 10000,1 <= m <= 100000,-1000<=c<=1000,-1<=w_i<=1000,w_i≠0。
时间限制:1.0s 内存限制:256.0MB
问题描述
栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修。市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他。
C市中有n个比较重要的地点,市长希望这些地点重点被考虑。现在可以修一些道路来连接其中的一些地点,每条道路可以连接其中的两个地点。另外由于C市有一条河从中穿过,也可以在其中的一些地点建设码头,所有建了码头的地点可以通过河道连接。
栋栋拿到了允许建设的道路的信息,包括每条可以建设的道路的花费,以及哪些地点可以建设码头和建设码头的花费。
市长希望栋栋给出一个方案,使得任意两个地点能只通过新修的路或者河道互达,同时花费尽量小。
输入格式
输入的第一行包含两个整数n, m,分别表示C市中重要地点的个数和可以建设的道路条数。所有地点从1到n依次编号。
接下来m行,每行三个整数a, b, c,表示可以建设一条从地点a到地点b的道路,花费为c。若c为正,表示建设是花钱的,如果c为负,则表示建设了道路后还可以赚钱(比如建设收费道路)。
接下来一行,包含n个整数w_1, w_2, …, w_n。如果w_i为正数,则表示在地点i建设码头的花费,如果w_i为-1,则表示地点i无法建设码头。
输入保证至少存在一个方法使得任意两个地点能只通过新修的路或者河道互达。
输出格式
输出一行,包含一个整数,表示使得所有地点通过新修道路或者码头连接的最小花费。如果满足条件的情况下还能赚钱,那么你应该输出一个负数。
样例输入
5 5
1 2 4
1 3 -1
2 3 3
2 4 5
4 5 10
-1 10 10 1 1
样例输出
9
样例说明
建设第2、3、4条道路,在地点4、5建设码头,总的花费为9。
数据规模和约定
对于20%的数据,1<=n<=10,1<=m<=20,0<=c<=20,w_i<=20;
对于50%的数据,1<=n<=100,1<=m<=1000,-50<=c<=50,w_i<=50;
对于70%的数据,1<=n<=1000;
对于100%的数据,1 <= n <= 10000,1 <= m <= 100000,-1000<=c<=1000,-1<=w_i<=1000,w_i≠0。
#include<stdio.h> #include<string.h> #include<algorithm> #include<algorithm> #define INF 0x3f3f3f3f #define IN __int64 #define ull unsigned long long #define ll long long #define N 100010 #define M 1000000007 using namespace std; int a ; int sum,ans; struct zz { int s; int e; int l; }p ; int cmp(zz a,zz b) { return a.l<b.l; } int find(int x) { return x==a[x]?x:a[x]=find(a[x]); } int judge1(int x,int y,int z) { int fx=find(x); int fy=find(y); if(fx!=fy) sum+=z,a[fx]=fy; else if(z<0) sum+=z; } int judge2(int x,int y,int z) { int fx=find(x); int fy=find(y); if(fx!=fy) ans+=z,a[fx]=fy; else if(z<0) ans+=z; } int main() { int i,j,k; int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=n;i++) a[i]=i; for(i=0;i<m;i++) scanf("%d%d%d",&p[i].s,&p[i].e,&p[i].l); for(i=m;i<n+m;i++) { p[i].s=0; p[i].e=i-m+1; scanf("%d",&p[i].l); if(p[i].l==-1) p[i].l=INF; } sort(p,p+n+m,cmp); sum=0;ans=0; for(i=0;i<n+m;i++) { if(p[i].l==INF) continue; judge1(p[i].s,p[i].e,p[i].l); } for(i=0;i<=n;i++) a[i]=i; for(i=0;i<n+m;i++) { if(p[i].s==0) continue; judge2(p[i].s,p[i].e,p[i].l); } k=0; for(i=1;i<=n;i++) if(a[i]==i) k++; if(k!=1) printf("%d\n",sum); else printf("%d\n",min(ans,sum)); } return 0; }
相关文章推荐
- spring mvc4:异常处理
- 性能测试
- BZOJ-1880 Elaxia的路线 SPFA+枚举
- Unity3d 着色器语法(Shader)
- ERP对项目管理的意义
- 浅谈JavaScript原型链继承方式与闭包
- Using Tags to Organize AWS Resources
- BZOJ-1880 Elaxia的路线 SPFA+枚举
- PHP flush sleep 输出缓存控制详解
- 讲解Oracle数据库中的数据字典及相关SQL查询用法
- 终于等到你 -- 北京理工大学考研复试小记
- hihocoder 1115 诺滋多姆
- UIBarButtonItem 、UITabBarItem 改变字体,大小,图片
- 更新内容
- C#程序开发中经常遇到的10条实用的代码
- post和get的区别
- Hadoop集群搭建
- 【C++】《C++标准程序库》小结第九章-算法
- Unity3D Shader
- Http头 Range、Content-Range【断点续传】