A题Kruskal+并查集。注意要先把已经修好的路遍历一遍形成最小生成树。
还有。我把修好的路看成1,未修好的路看成0.以后要认真读题啊警示自己~~~
-----------------------------------我是可爱的分割线--------------------------------------------
B、高兴
题意:每两个东西相邻有一个高兴值。找出总高兴值最大的排列。
输入样例
2
0 1
2 0
3
0 -1 7
3 0 3
3 3 0
输出样例
2
10
解法:
1.把链状想象成首尾断开的环状。就可以转换为状态压缩dp的旅行商问题。
2.旅行商问题:从顶点0出发,每个顶点走一遍,最后回到顶点。求权值最小值。
而这道题,只需转换为不加上最后回到起点的那条边,并且改为求权值的最大值即可。
代码如下:
int rec(int S,int v)
{
if(dp[S][v]>-INF)
return dp[S][v];
if(S==(1<<n)-1)
return dp[S][v]=0;
int res=-INF;
for(int u=0;u<n;u++)
if(!(S>>u&1))
{
int temp=rec(S|1<<u,u)+toy[v][u];
if(temp>res)
{
res=temp;
}
}
return dp[S][v]=res;
}
3.把每个物品都放在起点试一试,找出最大的权值。输出即可。
C、排序
题意:给n个数,从小到大输出。
输入样例
3
4 2 1
输出样例
1 2 4
解法:
D、爱好和平
题意:每两个顶点之间有且仅有一条边相连。现要求破坏其中一个顶点,得到两颗子树(或一条链),得到两棵中较大的那棵拥有的顶点数,求顶点数最小值。
输入样例
5 4
1 2
1 3
1 4
4 5
输出样例
1
解法:
1、如果这是一个圈,直接输出1;
2、如果是一棵树,用dfs(深度优先搜索)遍历。每个顶点的值就是它所有儿子节点的值相加。
具体实现:把max置为0,dfs遍历一遍它的孩子,每dfs一个孩子就把孩子的节点值加到max上,走完所有节点后,把当前节点的数组的值变为max(dp[n]=max)。
3、dfs结束后,把每个顶点都试一遍。最大子树的值maxson=max(maxson,dp[sole[j].v]);
4、注意!3中不要搜索自己的父亲。
E.萌学妹的手机(黑完学姐黑学妹。。。)
题意:在一副都是六边形的图片中。给出六边形边长找到起点和终点需要穿过的最少的边数。
输入样例
2
2.0
0 0
6 -1
2.0
0 0
9 -1
输出样例
2
3
解法:
1、先转换为斜60°的坐标。
因为实在找不到六边形就只能用小乌龟假装六边形了。
坐标转换:Sx=x-(y)/sqrt(3.0);
Sy=((y)*2.0)/sqrt(3.0);
2、把两个点周围搜一遍,找到最近的六边形中心。。。。。
3、