2016HUAS_ACM暑假集训3F - Jungle Roads

这个题目属于最小生成树问题,可以用Prim,也可以用Kruskal(还没试)。题意简单直接,给你一个图,求出它最小生成树的权值。

题目最有趣的地方就是图的顶点是字母,稍微处理一下就好了。

Sample Input

9                                        //顶点个数,0时结束

A 2 B 12 I 25                      //每个顶点与后面N个顶点连通   后面N组是顶点编号和权值       比如这组就是A与后面两个顶点(B,I)连通,其中AB=12,AI=25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35

3
A 2 B 10 C 40
B 1 C 20
0

Sample Output

216

30

套的模板吧,也没什么好说的。回头用Kruskal试试。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define INF 0x3f3f3f3f
 5 using namespace std;
 6
 7 int G[30][30],dis[30],flag[30];
 8
 9 int N,T,l,i,j,k,ans,minx;
10
11 char A,a;
12
13 void init()
14 {
15     memset(G,INF,sizeof(G));
16     memset(flag,0,sizeof(flag));
17 }
18
19 void Prim()
20 {
21     ans=0;
22     G[0][0]=0;
23     for(i=0;i<N;i++)
24         dis[i]=G[0][i];
25     flag[0]=1;
26     for(i=1;i<N;i++)
27     {
28         minx=INF;
29         k=0;
30         for(j=0;j<N;j++)
31         {
32             if(!flag[j]&&dis[j]<minx)
33             {
34                 minx=dis[j];
35                 k=j;
36             }
37         }
38         flag[k]=1;
39         ans+=minx;
40         for(j=0;j<N;j++)
41         {
42             if(!flag[j]&&dis[j]>G[k][j])
43                 dis[j]=G[k][j];
44         }
45     }
46     cout<<ans<<endl;
47 }
48
49 int main()
50 {
51     while((cin>>N),N)
52     {
53         init();
54         for(i=1;i<N;i++)
55         {
56             cin>>A>>T;
57             while(T--)
58             {
59                 cin>>a>>l;
60                 if(G[A-‘A‘][a-‘A‘]>l)
61                     G[A-‘A‘][a-‘A‘]=G[a-‘A‘][A-‘A‘]=l;//A点编号为0
62             }
63         }
64         Prim();
65     }
66     return 0;
67 }

时间: 2024-08-11 09:46:10

2016HUAS_ACM暑假集训3F - Jungle Roads的相关文章

2016HUAS_ACM暑假集训1A - 士兵队列训练问题

这道题我觉得是个简单的模拟题,整理一下思路,弄清楚题意就好了. 新手上路,采用两个数组进行交互赋值,用的方法也比较笨,思路差不多都在代码的注释里了. 下面是题目大意: 首先将士兵从1开始编号(士兵总数不超过5000),然后开始1 2 1 2...报数,报到2的士兵出列,剩下的向小序号方向靠拢,然后按照1 2 3 1 2 3... 报数,报到3的出列.以此类推(1 2 1 2...报数后再1 2 3 1 2 3...报数),直到剩下的士兵人数不超过3人,并且输出他们原来的编号. 格式要求如下: 第

2016HUAS_ACM暑假集训2L - Points on Cycle(圆上的点)

一个简单的几何题,自己在纸上列出方程解出结果的表达式,再用程序表达出来就行了. 大致题意:一个圆心在原点的圆,半径未知,现在给你圆上的一点,让你在这个圆上找到另外两点,使得这三点构成的三角形的周长最长. 样例输入:(第一行为一个整数N,表示后面有N组案例,每个案例给出一组圆上点的坐标) 2 1.500        2.000 563.585    1.251 样例输出:(其他两个点的坐标) 0.982 -2.299 -2.482 0.299 -280.709  -488.704  -282.8

2016HUAS_ACM暑假集训3G - 还是畅通工程

最小生成树,题目简单.套的Prim模板,其他的题目比较有意义. Sample Input 3                             //村庄个数1 2 1                       //连通情况及权值1 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50 Sample Output       //输出最小生成树的权 3 5 1 #include<stdio.h> 2 #include<string.h> 3 #de

2016HUAS_ACM暑假集训4A - 递推

利用组合公式C(n,m)=C(n-1,m)+C(n-1,m-1).也就是从n个数里面选择m个数.按递增方式放在每一层循环. 杨辉三角+二项式定理,还真是挺有“意思”的一道题.说实话,非原创.见谅..... 题目大意:一个循环结构有m层,第一层是1~n,以后每加一层,循环变量的初值都都在上一层的基础上加1. 例如:第一层是1~n,那么第二层就是2~n,以此类推.求出m层的循环次数(答案对1007取模). Sample Input 2                                

2016HUAS_ACM暑假集训4C - 递推

题目大意:给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形. 这里我们可以这样看: 对于行:假如是m单位长度,则长度为1的矩形有m个,长度为2的矩形有m-1个......长度为m的只有1个,所以总共的矩形是1+2+...+m=(1+m)*m/2个 对于列:同行可以. 所以,总的矩形数=行*列.得出通项公式N(m,n) =  (1+m)*(1+n)*m*n/4. #include<iostream> using namespace std; int t,n,m; int main(

2016HUAS_ACM暑假集训4D - 计数,排列

一个错排公式的基础应用. 大致题意:求n个数的错误排列方式.(每个都要错) 在这里先贴一下错排公式:D(1)=0:D(2)=1:D(n)=(n-1)*(D(n-1)+D(n-2)) 它的推导也非常有意思,用的应该是递归的思想吧(个人猜测). Sample Input 2 3 Sample Output 1 2 这题注意两点: 1.长整型__int64或者long long 2.最好打一下表,防止超时 然后,然后就过了呗...... #include<iostream> #include<

2016HUAS_ACM暑假集训2E - I Hate It

又是一个线段树的应用,不过跟上一题(D-排兵布阵)不同的是,这次是求某段区间上的最值,而不是某段区间和.当然,数据更新是必须的.D题注释已经很详细了,所以这题注释少点. 大致题意:给你N个已经排好的学生成绩,然后有M条指令,输出对应指令的结果.指令有两种: 1.Q  i  j:询问i到j的最值 2.U  i  j:把学生编号为i的成绩改为j 输入输出格式: Sample Input 5     6                    //第一行两个整数N,M,表示N个学生和M条指令( 0<N<

2016HUAS_ACM暑假集训4K - 基础DP

我不知道怎么用DP,不过DFS挺好用.DFS思路很明显,搜索.记录,如果刚好找到总价值的一半就说明搜索成功. 题目大意:每组6个数,分别表示价值1到6的物品个数.现在问你能不能根据价值均分. Sample Input                                  //6种价值物品的个数,全为0时结束 1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0 Sample Output                              //注意格式,空两行

2016HUAS_ACM暑假集训4M - 基础DP

简单的0-1背包问题,大家都会做的.题意不想解释太多. 简述题目的案例及以几个关键 Sample Input 1                            //测试组数T 5 10                       //骨头总个数N,背包总体积V 1 2 3 4 5                //N块骨头各自的价值 5 4 3 2 1                //N块骨头各自的体积 Sample Output        //输出最大价值 14 注意:每种骨头只