ZOJ 2326 Tangled in Cables

来源:互联网 发布:java主方法怎么写 编辑:程序博客网 时间:2024/06/13 23:28
#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;


}

0 0
原创粉丝点击