ZOJ 2326 Tangled in Cables

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <map>


using namespace std;
bool vis[10010];
bool  e[1010][1010];
double g[1010][1010];
double l[10010];//{l[i]存放顶点i到当前已建成的生成树中任意一顶点j的权值g[i][j]的最小值}
int main()
{
   double len;
   int n,m;
   int i,j,k;
   scanf("%lf",&len);


       string str;


       map<string,int> ma;
       memset(vis,1,sizeof(vis));
       memset(e,false,sizeof(e));
       memset(g,0,sizeof(g));
       memset(l,0x7f,sizeof(l));
       l[1]=0;


       ma.clear();


       scanf("%d",&n);
       for(  i = 1; i<=n; i++)
       {
          cin>>str;
          ma[str]= i;
       }


       scanf("%d",&m);
       for(  i = 1; i<=m; i++)
       {
           string str1,str2;
           double dis;
           cin>>str1;
           cin>>str2;
           scanf("%lf",&dis);
           g[ma[str1]][ma[str2]] = g[ma[str2]][ma[str1]] = dis;
           e[ma[str1]][ma[str2]] = e[ma[str2]][ma[str1]] = true;




       }
     for (i=0;i<n;i++)
     {
         int k=0;
         for (j=1;j<=n;j++) //找一个未加入到生成树中的顶点,记为k,要求k到当前生成树的代价量最小
            if (vis[j] && l[j]<l[k])
                 k=j;
                 //cout<<k<<"l[k]"<<l[k]<<endl;
         vis[k]=false;  //顶点k加入生成树
         for (j=1;j<=n;j++) //找到生成树中的顶点j,要求g[k][j]最小
         if (vis[j] && e[k][j] && g[k][j]<l[j])
         {
             l[j]=g[k][j];


         }
     }
     double total = 0;
      for (i=1;i<=n;i++)
      total += l[i];
    if(total <= len)
      printf("Need %.1lf miles of cable\n",total);
    else
      printf("Not enough cable\n");


return 0;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值