地道
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 368 测试通过 : 102
总提交 : 368 测试通过 : 102
比赛描述
话说南京的城市规划一般一般,各个大学分布极不合理,难于沟通。
我们夜猫族打算用一种常人难以想象的方式建立大学通道:用地道使得所有大学都相通。
但地道的造价不菲,而大学生是贫困群体,所以我们希望用尽量小的代价。
已知建设一条地道的费用和地道的距离成正比。其关系是,一个单位的距离需要的花费是7个ACM币,在ACM世界里货币的换算方法简单极了,29个ACM币等于一个DS币,17个DS币等于一个算法币。(ACM币单位为ac,DS币单位为ds,算法币单位为al)
但是学校太多了,而且有些学校不能直接连接(比如,跨湖或跨江地道太难建设了)。需要聪明的你的帮助。
我们夜猫族打算用一种常人难以想象的方式建立大学通道:用地道使得所有大学都相通。
但地道的造价不菲,而大学生是贫困群体,所以我们希望用尽量小的代价。
已知建设一条地道的费用和地道的距离成正比。其关系是,一个单位的距离需要的花费是7个ACM币,在ACM世界里货币的换算方法简单极了,29个ACM币等于一个DS币,17个DS币等于一个算法币。(ACM币单位为ac,DS币单位为ds,算法币单位为al)
但是学校太多了,而且有些学校不能直接连接(比如,跨湖或跨江地道太难建设了)。需要聪明的你的帮助。
输入
第一行包含两个整数N,M。N表示学校总数(1≤N≤100),M表示所有能直接连接的学校的数量(1<=M<=N*(N-1)/2)。
以下M行,每行三个正整数,第一个数和第二个数为学校编号,第三个为这两个学校间的距离L(0<=L<=10000)。
输出
若干带单位(ac,ds或al)的正整数,数字要尽可能小,单位复杂一点无妨(即把单位(ac,ds,al)转换得尽可能大,能用大单位表示尽量用大单位)数与单位间无空格。
样例输入
4 6
1 2 4
1 3 9
1 4 21
2 3 8
2 4 17
3 4 16
样例输出
6ds22ac
题目来源
wwm
#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 101 //下标从1开始,所以不能写成100
#define INF 1000000000 //不要相信题目中的(0<=L<=10000)
int N,M;
int dis[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //两节点之间的距离
int min_dis[MAX_VERTEX_NUM]; //U中的顶点到V-U顶点的最小距离,如果i∈U则min_dis[i]=0;
bool vist[MAX_VERTEX_NUM]={0};
int main(){
int i,j,k,L,new_min;
long sum=0;
cin>>N>>M;
for(i=1;i<=N;++i){ //距离全部设为INF
min_dis[i] = INF;
for(j=1;j<=N;++j){
dis[i][j] = INF;
}
}
while(M--){
cin>>i>>j>>L;
dis[i][j] = L;
dis[j][i] = L;
}
k = 1; //节点1先进入U
for(i=1;i<=N;++i){
min_dis[k] = 0;
vist[k] = 1;
for(j=1;j<=N;++j){ //新节点加入后,更新min_dis[]
if(!vist[j] && min_dis[j]>dis[k][j])
min_dis[j] = dis[k][j];
}
new_min = INF; //寻找新的最小距离顶点
for(j=1;j<=N;++j){
if(!vist[j] && new_min>min_dis[j]){
new_min = min_dis[j];
k = j;
}
}
if(new_min == INF)
break;
sum += new_min;
}
sum *= 7;
if(!sum){
cout<<0<<"ac"<<endl;
return 0;
}
if(sum/493){
cout<<sum/493<<"al";
sum %= 493;
}
if(sum/29){
cout<<sum/29<<"ds";
sum %= 29;
}
if(sum){
cout<<sum<<"ac";
}
cout<<endl;
}