_Never_

I walk slowly,but I will never stop.

导航

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;
}

 

posted on 2012-03-19 22:04  _Never_  阅读(366)  评论(0编辑  收藏  举报