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; }*/
相关文章推荐
- 2007年浙大研究生复试机试真题-统计字符
- 2007年浙大研究生复试机试真题-最小长方形
- 2007年浙大研究生复试机试真题-游船出租
- 2007年浙大研究生复试机试真题-EXCEL排序
- 题目1024:畅通工程 2007年浙江大学计算机及软件工程研究生机试真题
- 九度题目1024:畅通工程 2007年浙江大学计算机及软件工程研究生机试真题
- 畅通工程续(2008浙大研究生复试热身赛[最短路径] hdoj 1874)
- 2005年浙江大学计算机及软件工程研究生机试真题 畅通工程
- 九度题目1012:畅通工程 2005年浙江大学计算机及软件工程研究生机试真题
- 2006年浙大研究生复试机试真题-火星A+B
- 2008浙大研究生复试热身赛2----畅通工程续
- 畅通工程 hdu 1863 最小生成树+并查集 浙大计算机研究生复试上机考试-2007年
- 浙大复试机试 HDU 1879 继续畅通工程
- 浙大研究生复试上机考试2005——畅通工程
- 题目1017:还是畅通工程(2006年浙江大学计算机及软件工程研究生机试真题)
- 2006年浙大研究生复试机试真题-畅通工程
- 2006年浙大研究生复试机试真题-统计同成绩学生人数
- 2006年浙大研究生复试机试真题-简单计算器
- 还是畅通工程 2006年浙江大学计算机及软件工程研究生机试真题
- 题目1012:畅通工程(2005年浙江大学计算机及软件工程研究生机试真题)