poj 1251
此题注意输入,还有注意map[i][i]=0,基本就可以AC了
#include<iostream>
using namespace std;
int map[30][30];
int lowcost[30];
bool vis[30];
int n;
int prime()
{
int i,j,k,min,sum=0;
for(i=1;i<=n;i++)
lowcost[i]=map[1][i];
vis[1]=k;
for(i=1;i<n;i++)
{
min=10000;
k=0;
for(j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
if(k==0) break;
vis[k]=1;
sum+=lowcost[k];
for(j=1;j<=n;j++)
if(!vis[j]&&lowcost[j]>map[k][j])
lowcost[j]=map[k][j];
}
return sum;
}
int main()
{
int i,j,k,t;
char ch[30],tc[100];
while(scanf("%d",&n)!=EOF&&n)
{
memset(vis,0,sizeof(vis));
memset(map,10000,sizeof(map));
for(i=1;i<n;i++)
{
map[i][i]=0;//这里要赋值为0,不然会出错
scanf("%s",ch);
scanf("%d",&k);
for(j=1;j<=k;j++)
{
scanf("%s",tc);
scanf("%d",&t);
map[ch[0]-'A'+1][tc[0]-'A'+1]=map[tc[0]-'A'+1][ch[0]-'A'+1]=t;//字符串输入
}
}
map[n][n]=0;
printf("%d\n",prime());
}
}
poj 1258
最短路。。直接代码
#include<iostream>
#define inf 0xfffffff
using namespace std;
int map[105][105];
int lowcost[105];
bool vis[105];
int n;
int prime()
{
int i,j,k,min,sum=0;
for(i=1;i<=n;i++)
lowcost[i]=map[1][i];
vis[1]=1;
for(i=1;i<n;i++)
{
min=inf;
for(j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
vis[k]=1;
sum+=lowcost[k];
for(j=1;j<=n;j++)
if(!vis[j]&&lowcost[j]>map[k][j])
lowcost[j]=map[k][j];
}
return sum;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
memset(vis,0,sizeof(vis));
printf("%d\n",prime());
}
}
poj 2421
已经建立连接的城镇要把距离初始化为0
#include<iostream>
using namespace std;
int map[105][105];
int lowcost[105];
bool vis[105];
int n;
int prime()
{
int i,j,k,min,sum=0;
for(i=1;i<=n;i++)
lowcost[i]=map[1][i];
vis[1]=1;
for(i=1;i<n;i++)
{
min=100000;
for(j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
sum+=lowcost[k];
vis[k]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]>map[k][j])
lowcost[j]=map[k][j];
}
}
return sum;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
int i,j,t,a,b;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=0;
}
printf("%d\n",prime());
}
}
poj 2458
注意题意,英语还需要加强啊,输入的是最小生成树中的最大的边
#include<iostream>
using namespace std;
int map[505][505];
int lowcost[505];
int vis[505];
int n;
void prime()
{
int i,j,k,min;
for(i=1;i<=n;i++)
lowcost[i]=map[1][i];
vis[1]=1;
for(i=1;i<n;i++)
{
min=100000;
k=0;
for(j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
if(k==0) break;
vis[k]=1;
for(j=1;j<=n;j++)
if(!vis[j]&&lowcost[j]>map[k][j])
lowcost[j]=map[k][j];
}
}
int main()
{
int t,i,j,max;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(vis,0,sizeof(vis));
//memset(map,100000,sizeof(map));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
prime();
max=0;
for(i=1;i<=n;i++)
if(lowcost[i]>max)
max=lowcost[i];
printf("%d\n",max);
//system("pause");
}
}