地道
2015-07-18 10:34
302 查看
Description
话说南京的城市规划一般一般,各个大学分布极不合理,难于沟通。
我们夜猫族打算用一种常人难以想象的方式建立大学通道:用地道使得所有大学都相通。
但地道的造价不菲,而大学生是贫困群体,所以我们希望用尽量小的代价。
已知建设一条地道的费用和地道的距离成正比。其关系是,一个单位的距离需要的花费是7个ACM币,在ACM世界里货币的换算方法简单极了,29个ACM币等于一个DS币,17个DS币等于一个算法币。(ACM币单位为ac,DS币单位为ds,算法币单位为al)
但是学校太多了,而且有些学校不能直接连接(比如,跨湖或跨江地道太难建设了)。需要聪明的你的帮助。
Input
第一行包含两个整数N,M。N表示学校总数(1≤N≤100),M表示所有能直接连接的学校的数量(1<=M<=N*(N-1)/2)。
以下M行,每行三个正整数,第一个数和第二个数为学校编号,第三个为这两个学校间的距离L(0<=L<=10000)。
Output
若干带单位(ac,ds或al)的正整数,数字要尽可能小,单位复杂一点无妨(即把单位(ac,ds,al)转换得尽可能大,能用大单位表示尽量用大单位)数与单位间无空格。
Sample Input
4 6
1 2 4
1 3 9
1 4 21
2 3 8
2 4 17
3 4 16
Sample Output
6ds22ac
话说南京的城市规划一般一般,各个大学分布极不合理,难于沟通。
我们夜猫族打算用一种常人难以想象的方式建立大学通道:用地道使得所有大学都相通。
但地道的造价不菲,而大学生是贫困群体,所以我们希望用尽量小的代价。
已知建设一条地道的费用和地道的距离成正比。其关系是,一个单位的距离需要的花费是7个ACM币,在ACM世界里货币的换算方法简单极了,29个ACM币等于一个DS币,17个DS币等于一个算法币。(ACM币单位为ac,DS币单位为ds,算法币单位为al)
但是学校太多了,而且有些学校不能直接连接(比如,跨湖或跨江地道太难建设了)。需要聪明的你的帮助。
Input
第一行包含两个整数N,M。N表示学校总数(1≤N≤100),M表示所有能直接连接的学校的数量(1<=M<=N*(N-1)/2)。
以下M行,每行三个正整数,第一个数和第二个数为学校编号,第三个为这两个学校间的距离L(0<=L<=10000)。
Output
若干带单位(ac,ds或al)的正整数,数字要尽可能小,单位复杂一点无妨(即把单位(ac,ds,al)转换得尽可能大,能用大单位表示尽量用大单位)数与单位间无空格。
Sample Input
4 6
1 2 4
1 3 9
1 4 21
2 3 8
2 4 17
3 4 16
Sample Output
6ds22ac
#include<iostream> #include<cstdio> #include<queue> using namespace std; #define M 110 #define N 4949 const int INF=1e8; struct node { int v,c; node(int vv=0,int cc=0):v(vv),c(cc){} bool operator<(const node&obj)const { return c>obj.c; } }; int cost[2*N],nxt[2*N],end[2*N],head[M],ans[M],e,V,visit[M],aa,bb,cc; void addedge(int a,int b,int c) { end[e]=b,cost[e]=c,nxt[e]=head[a],head[a]=e++; } void change(int v) { aa=v/493; v%=493; bb=v/29; v%=29; cc=v; } int prime() { int i,j,k,P,res=0; node tmp; priority_queue<node> que; visit[1]=1,ans[1]=0; P=1; for(i=1;i<V;i++) { for(j=head[P];j!=-1;j=nxt[j]) { k=end[j]; if(!visit[k] && ans[k]>cost[j]) { ans[k]=cost[j]; que.push(node(k,ans[k])); } } while(!que.empty() && visit[que.top().v]) que.pop(); tmp=que.top();que.pop(); visit[P=tmp.v]=1; } for(j=1;j<=V;j++) res+=ans[j]; return res; } int main() { // freopen("in.txt","r",stdin); int E,i,a,b,c,res; scanf("%d %d",&V,&E); memset(head,-1,sizeof(head)); memset(visit,0,sizeof(visit)); for(i=1;i<=V;i++) ans[i]=INF; for(i=1;i<=E;i++) { scanf("%d %d %d",&a,&b,&c); addedge(a,b,c); addedge(b,a,c); } res=7*prime(); change(res); if(aa) printf("%dal",aa); if(bb) printf("%dds",bb); if(cc) printf("%dac",cc); printf("\n"); return 0; }
相关文章推荐
- SSL/TLS协议运行机制的概述
- linux运维人员需要知道的重要/常用目录介绍
- ajax提交form表单的两种方法
- 1048. Find Coins (25)
- [UEFI启动教程][第三章]BIOS锁定纯UEFI启动的解锁办法
- 3Sum
- wordpress添加后台菜单及权限设置
- java初学笔记20150718.十进制数转换为二进
- 1048. Find Coins (25)
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
- GO语言练习:channel 缓冲机制
- 黑马程序员——Java基础---多线程
- java-循环-break用法
- 9patch图片的制作
- 叙拉古猜想
- 银行储蓄系统
- Android ImageView分析并展开
- A星算法
- 牛顿迭代法
- web.xml中servlet-mapping的url-pattern的配置