1005
Posted Si考者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1005相关的知识,希望对你有一定的参考价值。
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。<br>
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。<br><br>当N为0时输入结束。
Output
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
Sample Input
3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
Sample Output
3 1 0
解题思路:
prim算法求最小生成树
代码:
#include<iostream> using namespace std; const int N=110; const int INF=0x3f3f3f3f; int n,ans; int imap[N][N],dis[N],vis[N]; void Prim(){ int i; for(i=1;i<=n;i++){ dis[i]=imap[1][i]; vis[i]=0; } dis[1]=0; vis[1]=1; int j,k,tmp; for(i=1;i<=n;i++){ tmp=INF; for(j=1;j<=n;j++) if(!vis[j] && tmp>dis[j]){ k=j; tmp=dis[j]; } if(tmp==INF) break; vis[k]=1; ans+=dis[k]; for(j=1;j<=n;j++) if(!vis[j] && dis[j]>imap[k][j]) dis[j]=imap[k][j]; } } int main(){ while(~scanf("%d",&n)&&n){ int ii,jj,temp1,temp2; for(int i=0;i<n*(n-1)/2;i++) { scanf("%d %d",&ii,&jj); scanf("%d",&temp1); scanf("%d",&temp2); if(temp2) {imap[ii][jj]=0; imap[jj][ii]=0;} else {imap[ii][jj]=temp1; imap[jj][ii]=temp1; } } ans=0; Prim(); printf("%d\n",ans); } return 0; }
以上是关于1005的主要内容,如果未能解决你的问题,请参考以下文章
更改片段(子片段)时 RecyclerView 中的奇怪叠加
如何使用对象列表在片段中实现newinstace模式[重复]
将 Google API 客户端对象从活动传递到滑动选项卡片段