http://acm.hdu.edu.cn/showproblem.php?pid=1301 Lagrishan热带岛屿的首领有一个问题。几年前,一批外国援助资金花在了村庄之间的额外道路上。但是丛林无情地超越了道路, 所以大型的公路网络太昂贵,无法维持。长老会必须停止维护一些道路。上面左边的地图显示了现在使用的所有道路和每月AACMS的维护费用。 当然,需要有办法在所有的村庄之间保持道路,即使路线没有以前那么短。首席长老想告诉长老会, 他们每月能在AACMS中花费最少的钱来维持连接所有村庄的道路。在上面的地图上,村庄被标记为I。 右边的地图显示的道路,可以保持最便宜,每月216 AACMS。你的任务是编写一个程序来解决这些问题。 输入由一到100个数据集组成,后面的最后一行仅包含0个。每一个数据集都只包含一个N, 这是村庄的数目,1<n<27,村庄被字母首字母N标记,大写。每个数据集以N-1线完成, 以字母顺序从村庄标签开始。最后一个村庄没有排。一个村庄的每一条线都是从村庄标签开始的, 后面跟着一个数字,K,从这个村庄到村庄的道路,后来在字母表中加上标签。如果k大于0,则该行继续使用k个道路中的每个数据 。每条道路的数据是道路的另一端的村庄标签,其次是AACMS道路的每月维护成本。 维护成本将是小于100的正整数。行中的所有数据字段由单个空白分隔。路网总是允许所有村庄之间的旅行。 这个网络永远不会有超过75条道路。没有村庄会有超过15条道路通往其他村庄(在字母表之前或之后)。 在下面的样本输入中,第一个数据集与上面的映射一致 每个数据线的输出是一个整数:每个月AACMS的最小成本来维持连接所有村庄的道路系统。 警告:检查每一组可能道路的强力解决方案不会在一分钟的时间内完成。 #include <bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f const int maxn=30; int n; int a[maxn][maxn]; int vis[maxn]; int dis[maxn]; int prim() { int temp,conut =0; for(int i=1; i<=n; i++) { dis[i]=a[1][i]; } memset(vis,0,sizeof(vis)); vis[1]=1; for(int i=1; i<n; i++)//关键点注意!!!! { int minn=inf; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]<minn) minn=dis[temp=j]; } if(minn==inf) return -1; vis[temp]=1; conut+=dis[temp]; for(int j=1; j<=n; j++) { if(dis[j]>a[temp][j]&&!vis[j]) dis[j]=a[temp][j]; } } return conut; } int main() { int i,j,k,ans,cost; char str; while(cin>>n&&n!=0) { getchar(); for(i=1; i<=n; i++) for(j=1; j<=n; j++) a[i][j]=(i==j?0:inf); for(i=1; i<n; i++) { cin>>str>>k; getchar(); while(k--) { cin>>str>>cost; getchar(); j=str-'A'+1; a[i][j]=a[j][i]=cost; } } ans=prim(); cout<<ans<<endl; } return 0; }
HDU 1301 (prim )
猜你喜欢
转载自blog.csdn.net/beposit/article/details/80565313
今日推荐
周排行