poj 2075 Tangled in Cables

来源:互联网 发布:js实现饼图 编辑:程序博客网 时间:2024/05/17 21:15

简单的prim,一次就AC了,高兴。

Memory: 648KTime: 0MSLanguage: CResult: Accepted

#include<stdio.h>

#include<string.h>
#define INF 1<<30
#define MAXN 251
double  arr[MAXN][MAXN],total; 
int  used[MAXN];
double dis[MAXN];

struct node
{
char name[27];
int num;
}f[MAXN];

int n,m;
 //prime:每次都从剩下的边中选出最短的一条,标记相关的顶点,并且修改相关边的值 
void prim(int n) 
{
int v;
double min;
int i,j;
for(i=1;i<=n;i++) //先默认第一个为待选节点
{
used[i]=0; 
dis[i]=arr[1][i];

used[1]=1; 
while(1) 
{
min=INF;
v=0; 
for(i=1;i<=n;i++) 
if(!used[i] && dis[i]<min) //在待选节点中选出最小
{
min=dis[i]; 
v=i; 

if(v==0) 
break; 
total=total+min;
used[v]=1; 
for(j =1;j<=n;j++) 
if(!used[j] && dis[j]>arr[v][j])//新引入的顶点到其他顶点的边值是否小于原来的边值   
dis[j]=arr[v][j];
}
}                   

int main() 
{
double sum,s;
int i,x,y,j;
char a[27],b[27];
scanf("%lf",&sum);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",f[i].name);
f[i].num=i;
}
scanf("%d",&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
arr[i][j]=INF;
for(i=1;i<=m;i++)
{
scanf("%s%s%lf",a,b,&s);
for(j=1;j<=n;j++)
if(strcmp(a,f[j].name)==0)
{
x=f[j].num;
break;
}
for(j=1;j<=n;j++)
if(strcmp(b,f[j].name)==0)
{
y=f[j].num;
break;
}
if(s<arr[x][y])
       arr[x][y]=arr[y][x]=s;
}
total=0;
prim(n);
if(total>sum)
printf("Not enough cable \n");
else
   printf("Need %.1f miles of cable\n",total);
return 0;
}      

原创粉丝点击