您的位置:首页 > 编程语言 > Go语言

2007年浙大研究生复试机试真题-畅通工程

2012-04-20 10:03 363 查看
/*题目描述
省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。
经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
输入
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );
随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。
为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
输出
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出"?"。
样例输入
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
样例输出
3
?
*/
#include <cstdio>      //  Prim 算法  1、最小生成树 2、检查是否为连通图
#include <iostream>
#include <string.h>
using namespace std;
#define inf 999999
#define max 105
int dist[max];
int tu[max][max];
int visit[max];
int main()
{
int n,m,i,j,num;
int a,b,cost;
//	freopen("f:/in.txt","r",stdin);
while(scanf("%d %d",&n,&m) && n)
{
memset(dist,inf,sizeof(dist));
memset(visit,0,sizeof(visit));
memset(tu,inf,sizeof(tu));
for(i=1;i<=n;i++)               //  Input
{
scanf("%d%d%d",&a,&b,&cost);
tu[a][b]=tu[b][a]=cost;
}

visit[1]=1;
dist[1]=0;
cost=0;
num=1;   // record the number of node
for(i=2;i<=m;i++)
dist[i]=tu[1][i];

for(i=1;i<=m;i++)
{
int v=1;
int min=inf;
for(j=1;j<=m;j++)
{
if(!visit[j] && dist[j]<min)
v=j;
}
min=dist[v];
visit[v]=1;
if(v!=1)
{
cost+=min;
num++;
}

for(j=1;j<=m;j++)
{
if(!visit[j] && dist[j]>tu[j][v])
dist[j]=tu[j][v];
}
}
if(num<m)        //  最后所并入的节点数小于 m ,无法构成联通的最小生成树
printf("?\n");
else
printf("%d\n",cost);

}
//	fclose(stdin);
return 0;
}

/*
#include <cstdio>         //    1.最小生成树  2.检查是否为连通图     kruskal algorithm    AC  10MS
#include <iostream>
#include <algorithm>
using namespace std;
int fa[105];
typedef struct{
int node1;
int node2;
int cost;
}Node;
Node t[5005];   //    the number of roads .   the maxmun number of the roads tend to be around 5000.
bool cmp(Node a,Node b)
{
return a.cost<b.cost;
}
int getFa(int n)
{
int r=n,s;
while(n!=fa
)
n=fa
;
while(r!=fa
)
{
s=r;
fa[r]=fa
;
r=fa[s];
}
return fa
;
}
int main()
{
int N,M;
int i,j;
int a,b,cost;
//	freopen("f:/in.txt","r",stdin);
while(~scanf("%d%d",&N,&M) && N)   //  N: the number of roads . M : the number of cottages
{
for(i=1;i<=N;i++)
fa[i]=i;                   //   Initiate : set each cottage(node) as a single tree

for(i=1;i<=N;i++)
{
scanf("%d%d%d",&a,&b,&cost);
t[i].node1=a;
t[i].node2=b;
t[i].cost=cost;
}
if(N<M-1)
{
printf("?\n");             //    非连通图   边数少于 节点数减一
continue;
}

sort(t+1,t+N+1,cmp);          //   sort by the cost of the roads.

for(i=1,j=0,cost=0;i<=N && j<M;i++)
{
if(getFa( t[i].node1 )!=getFa( t[i].node2 ))     //  union if the it dosen't constitute a circle
{
fa[ getFa( t[i].node1 ) ]=getFa( t[i].node2 );
j++;
cost+=t[i].cost;
}
}

if(j<M-1)
{
printf("?\n");             //    非连通图   最后得到的边数少于 节点数减一
continue;
}
printf("%d\n",cost);

}
//	fclose(stdin);
return 0;
}*/


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息