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

来源:互联网 发布:数据可视化d3 编辑:程序博客网 时间:2024/05/01 20:24
/*题目描述    省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。输入    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。输出    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出"?"。样例输入3 31 2 11 3 22 3 41 32 3 20 100样例输出3?*/#include <cstdio>      //  Prim 算法  1、最小生成树 2、检查是否为连通图#include <iostream>#include <string.h>using namespace std;#define inf 999999#define max 105int 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");elseprintf("%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])n=fa[n];while(r!=fa[n]){s=r;fa[r]=fa[n];r=fa[s];}return fa[n];}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;}*/