地道

  • 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

#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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值