zoukankan      html  css  js  c++  java
  • POJ 2075 Tangled in Cables

    也比较水:Hash+最小生成树,我用的是Prim;好的是我有复习了一下Hash

    View Code
    #include <stdio.h>
    #include <string.h>
    #include <memory.h>

    #define N 1003
    #define M 10000

    int head[N];
    char _data[N][22];
    int _next[N],pos;

    int nodevp[N];
    int nodeu[M],next[M],ind;
    float data[M],lowcost[N];


    int getKey(char *p)
    {
    unsigned long result=0;

    for( ; *p ;++p)
    result=5*result + *p;

    return int(result%N);
    }
    void Hinit()
    {
    memset(head,-1,sizeof(head));
    memset(_next,-1,sizeof(_next));
    pos=1;
    }
    void Hpush(char *p)
    {
    int key=getKey(p);

    _next[pos]=head[key];
    strcpy(_data[pos],p);
    head[key]=pos;
    pos++;

    }
    int Hsearch(char *p)
    {
    int key=getKey(p);
    int pos=head[key];

    while(pos!=-1)
    {
    if(strcmp(_data[pos],p)==0)
    return pos;

    // pos=next[pos];这尼玛坑爹
    pos=_next[pos];
    }

    return -1;
    }


    void addedge(int v,int u,float val)
    {
    nodeu[ind]=u;
    data[ind]=val;
    next[ind]=nodevp[v];
    nodevp[v]=ind++;
    }

    float Prim(int n)
    {
    int i,j,v=1,u;
    float val,finalcost=0.0;

    for(i=0;i<=n;i++) lowcost[i]=200.0;
    for(i=1;i<n;i++)
    {
    lowcost[v]=-1.0;
    for(j=nodevp[v];~j;j=next[j])
    {
    u=nodeu[j]; val=data[j];
    if(lowcost[u]>0 && val<lowcost[u])
    lowcost[u]=val;
    }

    for(v=0,j=1;j<=n;j++)
    {
    if(lowcost[j]>0 && lowcost[v]>lowcost[j])
    v=j;
    }
    if(v==0) return 200.0;

    finalcost+=lowcost[v];
    }

    return finalcost;
    }


    void solve()
    {
    int i,n,m,v,u;
    char s[22],ss[22];
    float val,length;

    Hinit();
    scanf("%f %d",&length,&n);
    for(i=0;i<n;i++)
    {
    scanf("%s",s);
    Hpush(s);
    }

    memset(nodevp,-1,sizeof(nodevp));
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
    scanf("%s %s %f",s,ss,&val);
    v=Hsearch(s); u=Hsearch(ss);
    addedge(v,u,val);
    addedge(u,v,val);
    }

    val=Prim(n);
    if(val>length) printf("Not enough cable\n");
    else printf("Need %.1f miles of cable\n",val);

    }

    int main()
    {
    // freopen("input.txt","r",stdin);

    solve();

    return 0;
    }
  • 相关阅读:
    AODV路由协议的路由缓存队列详解
    NS各种常用资料(转)
    Zigbee之旅(二):第一个CC2430程序——LED灯闪烁实验(转)
    计算机核心期刊一览【转】
    NS2中能量模型的添加
    Zigbee之旅(一):开天辟地(转)
    NS2能量模型
    Zigbee之旅(三):几个重要的CC2430基础实验——外部中断(转)
    如何画MDI主窗体的背景
    Speed up the display of Delphi list components
  • 原文地址:https://www.cnblogs.com/fornever/p/2406961.html
Copyright © 2011-2022 走看看