• 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;
    }
  • 相关阅读:
    Linux防火墙配置(iptables, firewalld)
    利用RMAN恢复整个数据库
    RMAN常用命令汇总!
    Oracle RMAN 恢复数据库到不同主机(二)
    Oracle RMAN 恢复数据库到不同主机(一)
    linux sar命令详解
    Linux定时任务Crontab命令详解
    Win7 U盘安装Ubuntu16.04 双系统详细教程
    linux定时任务crontab
    linux服务器端口netstat
  • 原文地址:https://www.cnblogs.com/fornever/p/2406961.html
Copyright © 2020-2023  润新知