您的位置:首页 > 编程语言 > Java开发

POJ1251解题报告

2010-12-17 11:28 423 查看
又是一道最小生成树的题目,做的目的是为了熟悉PRIM。

首先用JAVA写了TLE,后来改成GCC,居然0MS。Oh my god!看来语言的瓶颈还是蛮要人命的。

PS:虽然我一心JAVA方向,而且许多大牛信誓旦旦的说JAVA其实跟C一样快了,看来,神马都是浮云!!!C果然还是王道!!!

代码如下:

#include<stdio.h>
int road[100][100];
int u[100];
int sum;
void reset()
{
int i,j;
for(i=0;i<100;i++)
{
for(j=0;j<100;j++)
{
road[i][j]=0;
}
}
for(i=0;i<10;i++)
{
u[i]=0;
}
sum=0;
}
void getInput()
{
int num;
while(1)
{
reset();
int i,j,k;
int pre = 0;
int id = 0;
scanf("%d",&num);
getchar();
if(num==0)
{
return;
}
for(i=0;i<num-1;i++)
{
char c1;
int num1;
scanf("%c",&c1);
getchar();
scanf("%d",&num1);
getchar();
for(j=0;j<num1;j++)
{
//char c=myinput[j].toCharArray()[0];
//int d=Integer.parseInt(myinput[j+1]);
//road[i][c-'A']=d;
//road[c-'A'][i]=d;
char c2;
int num2;
scanf("%c",&c2);
getchar();
scanf("%d",&num2);
getchar();
road[i][c2-'A']=num2;
road[c2-'A'][i]=num2;
}
}
//开始用prim方法进行最小生成树求解
int order=0;
order++;
u[order-1]=0;
while(order<num)
{
int min = -1;
int tag1=0;
for(i=0;i<order;i++)
{
for(j=0;j<num;j++)
{
int tag=1;
if(road[u[i]][j]==0)
{
//没路可通
continue;
}
else
{
for(k=0;k<order;k++)
{
if(u[k]==j)
{
tag=0;
break;
}
}
if(tag==1)
{
if(tag1==0)
{
pre=u[i];
id=j;
min=road[u[i]][j];
tag1=2;
}
else
{
if(min>road[u[i]][j])
{
pre=u[i];
id=j;
min=road[u[i]][j];
}
}
}//if
}//else
}//for
}//for
if(min!=-1)
{
order++;
u[order-1]=id;
sum+=min;
}
}//while
printf("%d/n",sum);
}//while
}
int main()
{
getInput();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java c gcc 语言