被sjy带刷题#1

    笔记
【问题描述】
给定一个长度为m的序列a,下标编号为1~m。序列的每个元素都是1~n的
整数。定义序列的代价为

你现在可以选择两个数x和y,并将序列a中所有的x改成y。x可以与y相等。
请求出序列最小可能的代价。
【输入格式】
输入第一行包含两个整数n和m。第二行包含m个空格分隔的整数,代表序
列a。
【输出格式】
输出一行,包含一个整数,代表序列最小的代价。
【样例输入 1】
4 6
1 2 3 4 3 2
【样例输出 1】
3
【样例输入 2】
10 5
9 4 3 8 8
【样例输出 1】
6
【样例解释】
样例 1 中,最优策略为将 4 改成 3。样例 2 中,最优策略为将 9 改成 4。
【数据规模和约定】

对于30%的数据,n,m<=100.
对于60%的数据,n,m ≤ 2000。
对于100%的数据,1 ≤ n,m≤ 100,000。

        城堡
【问题描述】
给定一张N个点M条边的无向连通图,每条边有边权。我们需要从M条边中
选出N − 1条, 构成一棵树。 记原图中从 1 号点到每个节点的最短路径长度为Di ,
树中从 1 号点到每个节点的最短路径长度为? ? ,构出的树应当满足对于任意节点
i,都有Di = Si 。
请你求出选出N − 1条边的方案数。
【输入格式】
输入的第一行包含两个整数N和M。
接下来M行,每行包含三个整数u、v和w,描述一条连接节点u和v且边权为
w的边。
【输出格式】
输出一行,包含一个整数,代表方案数对2^31 − 1取模得到的结果。
【样例输入】
3 3
1 2 2
1 3 1
2 3 1
【样例输出】
2
【数据规模和约定】
对于20%的数据,2<=N<=5,M<=10.
对于50%的数据,满足条件的方案数不超过 10000。
对于100%的数据,2≤ N ≤ 1000,N-1  ≤ M ≤ N(N-1)/2,1<=w<=100.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define maxn 1000
#define maxm 500000
#define mod 1<<31-1
using namespace std;
typedef long long LL;
int m,n;
int w[maxn][maxn], s[maxn][maxn], num[maxn], d[maxn];
LL dis[maxn], sum[maxn], ans(1);
queue<int> que;
int main(){
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for (int i=1;i<=m;i++) {
        int u,v,value;cin>>u>>v>>value;
        w[u][v] = w[v][u] = value;
        s[u][++num[u]] = v;
        s[v][++num[v]] = u;
    }
    for (int i=1;i<=n;i++) dis[i] = 0x7fffff;
    que.push(1);d[1] = 1;dis[1] = 0;
    do{
        int h = que.front();d[h] = 0;
        que.pop();
        for (int i=1;i<=num[h];i++){
            if (dis[s[h][i]] > dis[h] + w[h][s[h][i]]){
                dis[s[h][i]] = dis[h] + w[h][s[h][i]];
                if (!d[s[h][i]]){
                    que.push(s[h][i]),d[s[h][i]] = 1;
                }
            }
        }
    }while(!que.empty());
    que = queue<int>();
    memset(d, 0, sizeof(d));
    que.push(1),d[1] = 1,sum[1] = 1;
    do{
        int h = que.front();d[h] = 0;
        que.pop();
        for (int i=1;i<=num[h];i++){
            if (dis[s[h][i]] == dis[h]+w[h][s[h][i]]){
                sum[s[h][i]] == mod ? sum[s[h][i]] = 1 : sum[s[h][i]]++;
                if (!d[s[h][i]]) {
                    que.push(s[h][i]),d[s[h][i]] = 1;
                }
            }
        }
    }while(!que.empty());
    for (int i=1;i<=n;i++) ans=(ans*sum[i])%m;
    cout << ans << endl;
    return 0;
}  

castle.cpp

时间: 2024-12-30 04:21:42

被sjy带刷题#1的相关文章

跟着chengyulala刷题之[kuangbin带你飞]之&#39;并查集&#39;专题/斜眼笑

[kuangbin带你飞] 专题1-23 https://vjudge.net/article/187 专题五 并查集 POJ 2236 Wireless Network  http://poj.org/problem?id=2236POJ 1611 The Suspects  http://poj.org/problem?id=1611HDU 1213 How Many Tables  http://acm.hdu.edu.cn/showproblem.php?pid=1213HDU 3038

周刷题第一期总结(two sum and two numbers)

由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手.所以只能采用最笨的办法,刷题.从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧. 暂时的目标是一周最少两道,可能会多做多想,工作再忙也会完成这个最低目标. Two sum: Given an array of integers, return indices of the two numbers such that they add up to a specific target. Y

【leetcode刷题笔记】String to Integer (atoi)

Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes: It is intended for this problem to be spe

python部落刷题宝学到的内置函数(二)

感觉到刷题宝有一个好处,也许也不是好处,它的答案必须是真正输出的值,也就是说应该输出字符串aaaa的时候,答案必须写成界面上返回的值,即'aaaa'.有利于真正记忆返回值类型,但是....太繁琐了 1.getattr():python自省函数,用于查看某对象是否具有某种属性并返回属性值或者末字符串,参数格式(一个对象, 属性名称字符串, 不存在时输出的字符串),举个例子: 1 class A: 2 def __init__(self): 3 self.name = 'hahahaha' 4 a

刷题方法论

[转自一亩三分田]谈谈面试官在面试coding题目时的考察终点与心理活动 本人简介: 曾经微软dev, 35+, 10年经验, 有FLG offer.  去年加入一个start up 公司, 最近前景不明, 在犹豫要不要去个稳定点的大公司.  我从sde开始面试其他人, 到现在估计面试过100+人次的面试和debrief. 我面过coding, problem solving, design, behavior.  本帖子只谈论纯粹coding, 视情况讨论要不要再开帖子讨论其他方面. 本文涉及

LeetCode开心刷题十三天——24

习惯就是人生的最大指导 ——休谟 24. Swap Nodes in Pairs Medium 1209107FavoriteShare Given a linked list, swap every two adjacent nodes and return its head. You may not modify the values in the list's nodes, only nodes itself may be changed. 防止用增加值,存储前后变量只进行值交换,而不处理

CSP-S集训刷题记录

$ CSP.S $ 集训刷题记录: $ By~wcwcwch $ 一.字符串专题: 1. [模板]$ manacher $ 算法 模型:求出字符串 $ S $ 中所有回文串的位置及长度. 个人理解:解决这类问题,回文串的对称性质最重要. 于复杂度最关键的一句话: $ f[i]=min~(~r-i~,~f[~mid\times2-i~]~)~ $ (实现不同,边界可能不一样) 这个 $ min $ 函数左边 $ r-i $ 是当前位置到它所属于的回文串边界的距离,右边 $ mid\times 2

刷题 11/05

从昨天开始刷题,但是昨天比较懒,没有总结一下.今天开始总结一下刷题什么的遇到的bug和之前不注意的事情. 顺时针旋转矩阵 有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度. 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300. 很简单的矩阵变换,我是通过两次矩阵变换得到的,首先对角线交换,然后左右翻转就可以了. class Rotate: def rotateMatrix(self, mat, n): c = [[0 for i in range(0

LeetCode刷题流程

(以下内容摘抄自刷知乎关于LeetCode的问题,原文链接:https://www.zhihu.com/question/31092580/answer/54194793) 刷题几个阶段: 1,第一遍:知道.直接看答案,不要自己想,了解所有最优解,方法技巧第一.做题套路,以印象为主. 2,第二遍:熟悉.过easy题,记住:做medium,重点题背,反复背.最简单会,大多不会.记住做题套路,以记住为主. 3,第三遍:做题.做easy题:做部分medium题,hard题有思路.夯实medium基础.