讨论 / 20分悬赏这个问题……
tamade 2009-01-14 22:28:00
点我顶贴 收藏 删除
http://www.rqnoj.cn/Discuss_Show.asp?DID=2898
#1 EBC5@2008-10-22 20:41:00
回复 删除
我用prim过了,每问题标程就可以。
#2 hades@2008-10-22 22:50:00
回复 删除
标程 const

maxn=100;

var

cost:array[1..maxn,1..maxn] of longint;

mincost,closed:array[1..maxn] of longint;

min,tot,k,i,j,n,x,y:longint;

begin

readln(n);

for i:=1 to n do

for j:=1 to n do

begin

read(cost[i,j]);

if (i<>j) and (cost[i,j]=0) then cost[i,j]:=maxlongint;

end;

for i:=1 to n do

begin

mincost[i]:=cost[1,i];

closed[i]:=1;

end;

for i:=2 to n do

begin

min:=maxlongint;

for j:=1 to n do

if (mincost[j]<min) and (mincost[j]<>0) then

begin

min:=mincost[j];

k:=j;

end;

inc(tot,mincost[k]);

mincost[k]:=0;

for j:=1 to n do

if (mincost[j]>cost[k,j]) and (mincost[j]<>0) then

begin

mincost[j]:=cost[k,j];

closed[j]:=k;

end;

end;

writeln(tot);

end.

#3 tamade@2008-10-22 23:03:00
回复 删除
晕,我也有标程。

我只是很诧异,不同的读图方式为什么答案不一样

#4 飞雪天涯@2008-11-12 07:50:00
回复 删除
/*

Show Problem 题目:拜年

问题编号:142 My Flag:Unaccepted

题目类型 图结构

描述

题目描述:

拜年是中国人少不了的风俗.还没过年呢,刚上小学的妮妮已经等不及要给她的小伙伴去拜年了,但是她不知道如

何规划才会使自己走的路最少.所以请叫您咯,她不想落下任何一位伙伴.为了走少花精力,她想走最少的路程去所

有伙伴的家里.您将得到一份各伙伴家路程的列表,您必须找出能走最少路程去所有小伙伴家的最少路程.

输入格式

输入文件第一行为妮妮小伙伴的个数,n(3<=n<=100)

下面是一个n*n的矩阵,表示每个小伙伴家的距离d(d<=100000),可以保证所有小伙伴都相互认识.

输出格式

只有一个输出为要去所有小伙伴家要走的最少路程

样例输入

4

0 4 9 21

4 0 8 17

9 8 0 16

21 17 16 0

样例输出

28

*/

//#include<fstream>

#include<iostream>

#include<climits>

using namespace std;

//ofstream fout ("pid193.out");

bool mst[1000][1000]={false},visited[1000]={false};

int n,G[1000][1000];

int prim(){

int count=0;

visited[0]=true;

for (int i=0;i<n-1;i++){

int min=INT_MAX,minj,mink;

for (int j=0;j<n;j++)

if (visited[j])

for (int k=0;k<n;k++)

if (!mst[j][k]/*&&!mst[k][j]*/&&!visited[k]&&min>G[j][k]){

minj=j;

mink=k;

min=G[j][k];

}

visited[mink]=mst[minj][mink]/*=mst[mink][minj]*/=true;

count+=G[minj][mink];

}

return count;

}

int main (void){

cin>>n;

for (int i=0;i<n;i++)

for (int j=0;j<n;j++)

cin>>G[i][j];

cout<<prim();

// int count=0;

// for (int i=0;i<n-1;i++)

// for (int j=i+1;j<n;j++)

// if (mst[i][j]) count+=G[i][j];

// cout<<count;

// while(1);

return 0;

}

#5 hws_sheng@2009-01-14 07:30:00
回复 删除
最短路径不可以过吗?
#6 why19931123@2009-01-14 22:28:00
回复 删除
赋初值为负数

var

f:array[1..100,1..100]of longint;

m,n,o,p,q,r:longint;

procedure prim;

var

lowcost,closest:array[1..100]of longint;

i,j,k,min:longint;

begin

for i:=1to m do

begin

lowcost[i]:=f[1,i];

closest[i]:=1;

end;

for i:=1to m-1do

begin

min:=2147483647;

for j:=1to m do

if(lowcost[j]<min)and(lowcost[j]<>-2147483647)

then begin

min:=lowcost[j];

k:=j;

end;

lowcost[k]:=-2147483647;

for j:=1to m do

if f[k,j]<lowcost[j]

then begin

lowcost[j]:=f[k,j];

closest[j]:=k;

end;

end;

j:=0;

for i:=2to m do

j:=j+f[closest[i],i];

write(j);

end;

function mi(i,j:longint):longint;

begin

if i<j

then mi:=i

else mi:=j;

end;

begin

readln(m);

for o:=1to m do

begin

for p:=1to m do

read(f[o,p]);

readln;

end;

prim;

end.

查看更多回复
提交回复