您的位置:首页 > 其它

TOJ--3073:Country Road 最小生成树(Prim)

2014-08-19 16:36 302 查看
题目源地址:http://acm.tju.edu.cn/toj/showp.php?pid=3073

AC代码:

//TOJ--3073:Country Road     最小生成树(Prim)
#include<iostream>
#include<memory.h>
#define MAX 1003
#define INF 1010
using namespace std;

int map[MAX][MAX],visited[MAX];
int dist[MAX];
int N,M,K;

int Prim()
{
int i,j,pos,min,sum;

for(i=1;i<=N;i++)
dist[i]=map[1][i];//dist[]初始化为从起点到各点的距离。

visited[1]=1;

for(i=1;i<N;i++)//总共N个节点,已经把第一个节点放进去了,剩下还得放N-1个节点
{
min=INF;
for(j=1;j<=N;j++)
{
if(!visited[j] && dist[j]<min)//找与刚加入的点距离最小的点
{
min=dist[j];
pos=j;
}
}

visited[pos]=1;//将pos点加入

for(j=1;j<=N;j++)//更新dist[]
{
if(!visited[j] && map[pos][j]<dist[j])
{
dist[j]=map[pos][j];
}
}
}

sum=0;
for(i=1;i<=N;i++)
{
sum=sum+dist[i];
if(dist[i]==INF)
return -1;
}
return sum;
}

int main()
{
int caseNum;
int i,j,s,t,d;
cin>>caseNum;
while(caseNum--)
{
cin>>N>>M>>K;
memset(visited,0,sizeof(visited));

for(i=1;i<=N;i++)//初始化map
{
for(j=1;j<=N;j++)
{
if(i==j)   map[i][j]=0;//节点到自身的距离设为0
else       map[i][j]=INF;//节点到其他节点的距离设为一个比较大的值(改值要比所有节点间最大权值大)
}
}

for(i=1;i<=M;i++)
{
cin>>s>>t;
map[s][t]=0;//输入已经有路径的节点对,并将有路径可达的节点间距离设为0
map[t][s]=0;//注意:无向图,双向赋值
}

for(i=1;i<=K;i++)
{
cin>>s>>t>>d;
map[s][t]=d;//若在节点s和t间修路,则距离为d
map[t][s]=d;
}
cout<<Prim()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: