也比较水: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;
}