HuZhenXing

与其感慨路难行,不如马上出发!


  • 首页

  • 分类

  • 归档

  • 关于

  • 标签

算法设计模板总结

发表于 2019-01-21 | Edited on 2023-03-05 | 分类于 算法设计与分析

链表反转

链表反转, 假设链表为a->b->…->n, 需要用反转a->b之前需要记录b的next指针,因此需要三个指针即可.

反转指针的写法有两种,递归法和循环法.

递归写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
return reverseList(nullptr, head);
}
// tail是head的前一个节点,反转head
// 最后返回反转后的头指针
ListNode* reverseList(ListNode* tail, ListNode* head){
if(!head) return tail;
ListNode* next = head->next; // 记录head的下一个节点
head->next = tail; // head 指向tail
tail = head; // tail 作为head继续递归
return reverseList(tail, next);
}
};

循环写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head){
if(!head) return head;
ListNode* pre = nullptr; // 初始时head的前一个节点为空
ListNode* mid = head;
while(mid&&mid->next){
ListNode* tail = mid->next; // 记录mid的下一个节点
mid->next = pre;
pre = mid;
mid = tail;
}
mid->next = pre; // pre始终是mid的前一个节点,循环结束后mid指向pre
return mid;
}
};

回文链表判断

  • 第一步,找到链表的中间节点
  • 第二步,反转起始节点到中间节点的这部分链表
  • 从中间节点向两边扩散,检查是否为回文链表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
bool isPalindrome(ListNode *head)
{
if (!head || !head->next)
return true;
ListNode *tail = head->next;
ListNode *mid = head;
bool odd = false; // odd 判断链表长度是否为奇数
while (tail && tail->next)
{
tail = tail->next;
mid = mid->next;
if (tail && tail->next)
{
tail = tail->next;
odd = false; // tail一次能走两步,是偶数长度的链表
}
else
{
odd = true; // 链表这一次走一步就到了尾部,是奇数长度的链表
break;
}
}
ListNode *right = mid->next; // 记录mid中间节点的下一个节点
ListNode *left = reverse(head, mid);

if (odd)
left = left->next; // 如果是奇数链表,左边链表左边走一位

// 中间到两边开始判断,是否为回文链表
while (right && left)
{

if (right->val != left->val)
return false;

right = right->next;
left = left->next;
if (!left && !right)
break;
}
return true;
}

// 反转head到tail部分的链表
ListNode *reverse(ListNode *head, ListNode *till)
{
if (!head || !head->next)
return head;
ListNode *pre = nullptr;
ListNode *mid = head;
while (mid != till && mid->next)
{
ListNode *tail = mid->next;
mid->next = pre;
pre = mid;
mid = tail;
}
mid->next = pre;
return mid;
}
};

快速排序(分治法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int partition(vector<int> nums, int left, int right){
int base = nums[left];
while(left<right){
while(left<right&&nums[right]>base)
right--;
nums[left] = nums[right];
while(left<right && nums[left]<=base)
++left;
nums[right] = nums[left];
}
nums[left] = base;
return left;
}

void quickSort(vector<int> nums,const int left, const int right){
if(left<right){
int index = partition(nums, left, right);
quickSort(nums, left, index);
quickSort(nums, index+1, right);
}
}

归并排序(分治法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
typedef long long LL;

LL mergeSort(VI& nums, const int low, const int high) {
LL ans = 0;
if (high <= low)
return 0;
else if (high - low == 1) {
if (nums[low] > nums[high]) {
swap(nums[low], nums[high]);
ans++;
}
return ans;
}
int mid = low + (high - low) / 2;
LL left = mergeSort(nums, low, mid);
LL right = mergeSort(nums, mid + 1, high);
ans = left + right;

VI leftNums(nums.begin() + low, nums.begin() + mid + 1);
VI rightNums(nums.begin() + mid + 1, nums.begin() + high + 1);
int i = 0, j = 0, index = low;
while (i < leftNums.size() && j < rightNums.size()) {
if (leftNums[i] <= rightNums[j])
nums[index++] = leftNums[i++];
else {
nums[index++] = rightNums[j++];
ans += leftNums.size() - i;
}
}
while (i < leftNums.size())
nums[index++] = leftNums[i++];
while (j < rightNums.size())
nums[index++] = rightNums[j++];
return ans;
}

数组中逆序对个数(分治法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int64_t reverseNum(vector<int> nums, int low, int high){
uint64_t ans = 0;
if(low>=high)
return ans;
else if(high - low == 1){
if(nums[low]>nums[high]){
swap(nums[low], nums[high]);
++ans;
}
return ans;
}
int mid = low + (high-low)/2;
int64_t left = reverseNum(nums, low, mid);
int64_t right = reverseNum(nums, mid+1, high);
ans += left + right;
vector<int> leftNums(nums.begin()+low, nums.begin()+mid+1);
vector<int> rightNums(nums.begin()+mid+1, nums.begin()+high+1);
int i = 0, j = 0, index = low;

while( i<leftNums.size() && j< rightNums.size() ){
if(leftNums[i]<=rightNums[j])
nums[index++] = leftNums[i++];
else{
nums[index++] = rightNums[j++];
ans += leftNums.size()-i; //
}
}
while(i<leftNums.size())
nums[index++] = leftNums[i++];
while(j<rightNums.size())
nums[index++] = rightNums[j++];
return ans;
}

平面最近点对(分治法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

double minDistance(vector<Point>& points, CI low, CI high) {
if (low >= high)
return 0;
else if (low == high - 1) {
double dis = distance(points[low], points[high]);
if (points[low].y > points[high].y)
swap(points[low], points[high]);
return dis;
}

int mid = low + (high - low) / 2;
int middle = points[mid].x;
double left = minDistance(points, low, mid);
double right = minDistance(points, mid, high);
double ans = min(left, right);
auto f = [](const Point& p1, const Point& p2)->bool {return p1.y < p2.y; };
sort(points.begin() + low, points.begin() + high + 1, f);
vector<Point> tmp;
for (int i = low; i < high; ++i) {
if (abs(points[i].x - middle) <= ans)
tmp.emplace_back(points[i]);
}

for (int i = 0; i < tmp.size(); ++i) {
for (int j = i + 1; j < min(static_cast<int>(tmp.size()), i + 12); ++j)
ans = min(ans, distance(tmp[i], tmp[j]));
}
return ans;
}

并查集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class UnionFind{
public:
vector<int> sz; // 表示每个集合的大小
vector<int> parent; // 表示每个顶点最终的父节点
// 初始化每个顶点父节点是其自身
int cnt;
UnionFind(const int n){
sz.assign(n, 1);
cnt = n;
parent.resize(n, 0);
for(int i = 0; i < n; ++i)
parent[i] = i;
}

// 找某个节点的父亲节点,注意返回值不能是 bool类型,必须是整数类型
int find(const int x){
if(x!=parent[x])
parent[x] = find(parent[x]);
return parent[x];
}

// 合并两个节点
bool merge(const int x, const int y){
int px = find(x);
int py = find(y);
if(px==py) return false;
if(sz[px]>=sz[py]){
sz[px]+=sz[py];
parent[py] = px;
}
else{
sz[py]+=sz[px];
parent[px] = py;
}
--cnt;
return true;
}
int getCnt(){return cnt;}
};

prime 算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<double> VD;
typedef vector<VD> VVD;

// 边的定义
struct Edge {
int from, to;
double dis;
Edge(CI f, CI t, CD d) :from(f), to(t), dis(d) {};
bool operator < (const Edge& e)const { return this->dis > e.dis; };
};

// 图用邻接矩阵存储的Prime算法
double MST(const VVD& graph) {
double ans = 0;
VI visit(graph.size(), 0);
priority_queue<Edge> myQueue;
for (int i = 0; i < graph.size(); ++i) {
myQueue.emplace(0, i, graph[0][i]);
}
VD dis(graph[0]);
while (!myQueue.empty()) {
Edge e = myQueue.top();
myQueue.pop();
if (visit[e.to] == 1)
continue;
visit[e.to] = 1;
ans += e.dis;
dis[e.to] = e.dis;
for (int i = 0; i < graph.size(); ++i)
if (visit[i] == 0 && graph[e.to][i] < dis[i])
myQueue.emplace(e.to, i, graph[e.to][i]);
}
return ans;
}

kruskal算法(贪心法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

// 边的定义
struct Edge {
int from, to;
double dis;
Edge(CI f, CI t, CD d) :from(f), to(t), dis(d) {};
bool operator < (const Edge& e)const { return this->dis < e.dis; };
};

// kruskal算法,需要用到并查集
double MST(const vector<Edge> edgeVec,const int vertex) {
sort(edgeVec.begin(), edgeVec.end());

QuickUnion qu(vertex);
double ans = 0;
int edgCnt = 0;
for(auto&e :edgeVec){
if(qu.merge(e.from, e.to)){
ans += e.dis;
edgCnt++;
if(edgCnt==vertex-1)
break;
}
}
return ans;
}

dijkstra算法(贪心法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
typedef vector<int> VI;
typedef vector<VI> VVI;

// 边的定义
struct Edge {
int from, to;
int dis;
Edge(CI f, CI t, CD d) :from(f), to(t), dis(d) {};
bool operator < (const Edge& e)const { return this->dis > e.dis; };
};

// 图用邻接矩阵存储的, 优先级队列实现,,计算start到target的最近距离
int dijkstra(const VVI& graph, const int start, const int target) {
VI dis(graph.size(), INT_MAX);
dis[start] = 0;
VI visit(graph.size(), 0);
priority_queue<Edge> myQueue;
myQueue.emplace(start, start, 0);
while(!myQueue.empty()){
Edge e = myQueue.top();
myQueue.pop();
if(visit[e.to]==1)
continue;
visit[e.to] = 1;
dis[e.to]= e.dis;
for(int i = 0;i<graph.size();++i){
if( visit[i]==0 && dis[i]- graph[e.to][i]> dis[e.to])
myQueue.emplace(e.to, i, dis[e.to]+ graph[e.to][i])
}
}
return dis[target];
}

spfa(动态规划)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
typedef vector<int> VI;
typedef vector<VI> VVI;

// 图用邻接矩阵存储, 队列实现的spfa算法,计算start到target的最近距离
int spfa(const VVI& graph, const int start, const int target) {
vector<int> dis(graph.size(), INT_MAX);
dis[start] = 0;
queue<int> myQueue;
VI enqueue(graph.size(), 0);
myQueue.push(start);
enqueue[start] = 1;
while(!myQueue.empty()){
int topNode = myQueue.front();
myQueue.pop();
enqueue[topNode] = 0;
for(int i = 0;i<graph.size();++i){
if(dis[i]- graph[topNode][i]> dis[topNode]){
dis[i] = dis[topNode]+graph[topNode][i];
if(enqueue[i]==0){
myQueue.emplace(i);
enqueue[i] = 1;
}
}
}
}
return dis[target];
}

POJ算法题目分类

发表于 2019-01-14 | Edited on 2023-03-05 | 分类于 算法设计与分析

分治法

  • 重建二叉树

  • 由中根序列和后根序列重建二叉树

  • 寻找中位数

  • Ultra-QuickSort

  • 逆序对数

  • 重要逆序对

  • 平面最近点对

  • Raid

贪心法

  • Huffman编码树

  • Gone Fishing

  • Agri-Net

  • Radar Installation

  • Stripies

  • Arctic Network

  • Til the Cows Come Home

  • Yogurt Factory

  • The Unique MST

  • Subway

  • 昂贵的聘礼

  • Building an Space Station

  • Checking An Alibi

回溯

  • 棋盘问题

拓扑排序

  • Sorting It All Out

  • All Discs Considered

动态规划

  • The Trangle

  • 滑雪

  • To the Max

  • BUY LOW,BUY LOWER

  • Maximum sum

  • Piggy-Bank

  • Heavy Transportation

  • 股票买卖

  • Currency Exchange

  • 合唱队形

  • 公共子序列

  • 棋盘分割

  • Multiplication Puzzle

  • Arbitrage

  • Longest Ordered Subsequence

  • Common Subsequence

  • LITTLE SHOP OF FLOWERS

  • To Europe!To Europe!

  • Palindrome

  • 怪盗基德的滑翔翼

  • Charm Bracelet

深搜、广搜

  • Red and Black

  • Dungeon Master

  • 仙岛求药

  • 抓住那头牛

二分匹配

  • Butterfly

堆考察

  • Dynamic Median

并查集

  • Percolation

网络流

  • Drainage Ditches

  • Dining

  • Dual Core CPU

  • Destroying the bus stations

  • Firing

  • The Perfect Stall

  • Jamie’s Contact Groups

  • 最小路径覆盖

  • Gopher II

  • Secret Milking Machine

最大值最小问题

  • 月度开销

  • Jamie’s Contact Groups

  • Secret Milking Machine

逻辑回归的理解

发表于 2019-01-10 | Edited on 2023-03-05 | 分类于 机器学习

逻辑回归(Logistic Regression)##

1. 回归(Regression)

  • 回归,我的理解来说,其直观的理解就是拟合的意思。我们以线性回归为例子,在二维平面上有一系列红色的点,我们想用一条直线来尽量拟合这些红色的点,这就是线性回归。回归的本质就是我们的预测结果尽量贴近实际观测的结果,或者说我们的求得一些参数,经过计算之后的预测结果尽可能接近真实值。
### 2. 逻辑回归的由来 ###
  • 对于二类线性可分的数据集,使用线性感知器就可以很好的分类。如下图中红色和蓝色的点,我们使用一条直线x1+x2=3x_1 +x_2 = 3x1​+x2​=3就可以区分两种数据集,在直线上方的属于红色类,直线下方的属于蓝色类。
- 但是如果二类线性不可分的数据集,我们无法找到一条直线能够将两种类别很好的区分,即线性回归的分类法对于线性不可分的数据无法有效分类。例如下图中的红色点和蓝色点,我们无法使用一条直线很好的区分这两类,但是我们可以使用非线性分类器,如果我们使用${x_1}^2+{x_2}^2 = 1$,在圆外面的为红色类,在圆里面的一类为蓝色类。
- 诚然,数据线性可分可以使用线性分类器,如果数据线性不可分,可以使用非线性分类器,这里似乎没有逻辑回归什么事情。但是如果我们想知道对于一个二类分类问题,对于具体的一个样例,我们不仅想知道该类属于某一类,而且还想知道该类属于某一类的概率多大,有什么办法呢?
  • 线性回归和非线性回归的分类问题都不能给予解答,因为线性回归和非线性回归的问题,假设其分类函数如下:
    $$ y = wx+b $$

  • y的阈值处于(−∞,+∞)(-\infty,+\infty)(−∞,+∞),此时不能很好的给出属于某一类的概率,因为概率的范围是[0,1],我们需要一个更好的映射函数,能够将分类的结果很好的映射成为[0,1]之间的概率,并且这个函数能够具有很好的可微分性。在这种需求下,人们找到了这个映射函数,即逻辑斯谛函数,也就是我们常说的sigmoid函数,其形式如下:

    11+e−z\frac{1}{1+e^{-z} } 1+e−z1​

  • sigmoid函数图像如下图所示

  • sigmoid函数完美的解决了上述需求,而且sigmoid函数连续可微分。
  • 假设数据离散二类可分,分为0类和1类,如果概率值大于1/2,我们就将该类划分为1类,如果概率值低于1/2,我们就将该类划分为0类。当z取值为0的时候,概率值为1/2,这时候需要人为规定划分为哪一类。

3. 逻辑回归的损失函数(Loss Function)和成本函数(Cost Function)

  • 在二类分类中,我们假定sigmoid输出结果表示属于1类的概率值,我们很容易想到用平方损失函数,即
  • 在这种情况下,我们φ(z(i))表示sigmoid对第i个值的预测结果,我们将sigmoid函数带入上述成本函数中,绘制其图像,发现这个成本函数的函数图像是一个非凸函数,如下图所示,这个函数里面有很多极小值,如果采用梯度下降法,则会导致陷入局部最优解中,有没有一个凸函数的成本函数呢?
  • 假设sigmoid函数φ(z)表示属于1类的概率,于是做出如下的定义:
  • 将两个式子综合来,可以改写为下式:
  • 上式将分类为0和分类和1的概率计算公式合二为一。假设分类器分类足够准确,此时对于一个样本,如果它是属于1类,分类器求出的属于1类的概率应该尽可能大,即p(y=1lx)尽可能接近1;如果它是0类,分类器求出的属于0类的概率应该尽可能大,即p(y=0lx)尽可能接近1。

  • 通过上述公式对二类分类的情况分析,可知我们的目的是求取参数w和b,使得p(ylx)对0类和1类的分类结果尽可能取最大值,然而实际上我们定义的损失函数的是求最小值,于是,很自然的,我们想到对p(ylx)式子加一个负号,就变成了求最小值的问题,这就得到了逻辑回归中的损失函数。

  • 不过,为了计算方便,我们通常对上述式子取log,因而得到下式:

  • 公式(1)是对概率公式取log,公式(2)是对公式(1)取相反数。上述公式的函数图像如下图所示。这是一个凸函数(斜率是非单调递减的函数即凸函数),因此可以用梯度下降法求其最小值。

  • 根据损失函数是单个样本的预测值和实际值的误差,而成本函数是全部样本的预测值和实际值之间的误差,于是对所有样本的损失值取平均数,得到我们的成本函数:

  • 损失函数是凸函数,m个损失函数的和仍然是凸函数,因而可以用梯度下降法求最小值。

4.极大似然法求解逻辑回归

  • 还可以用我们熟知的统计学知识——极大似然法估计逻辑回归中的参数w和b,上述得到的logp(y|w,x),假设目前有m组样本,分别为(x1,y1),(x2,y2)...(xm,ym)(x_1,y_1),(x_2,y_2)...(x_m,y_m)(x1​,y1​),(x2​,y2​)...(xm​,ym​),其中xi表示第i个样本的特征,yi表示第i个样本的类别,yi = 0或者1,利用极大似然法的原则,假设所有训练样本独立同分布,则联合概率为所有样本概率的乘积,即:
- 对上述公式两边取对数,得到下述公式,是不是对这个公式优点熟悉呢?这个公式就是我们的成本函数的和,对于这个公式和成本函数来说,取平均值和不取平均值没有影响。
- 按照极大似然法求极值的方法,分别对w的每个参数求偏导数使其为0,得到对数似然方程组,求解该方程,便可以到的w的参数。只是如果参数很多,求解方程组就会很复杂,此时可以考虑梯度下降法来求解。

5. 总结

  • 逻辑回归最大的优势在于它的输出结果不仅可以用于分类,还可以表征某个样本属于某类别的概率。

  • 逻辑斯谛函数将原本输出结果从范围(−∞,+∞)(-\infty,+\infty)(−∞,+∞) 映射到(0,1),从而完成概率的估测。

  • 逻辑回归得判定的阈值能够映射为平面的一条判定边界,随着特征的复杂化,判定边界可能是多种多样的样貌,但是它能够较好地把两类样本点分隔开,解决分类问题。

  • 求解逻辑回归参数的传统方法是梯度下降,构造为凸函数的代价函数后,每次沿着偏导方向(下降速度最快方向)迈进一小部分,直至N次迭代后到达最低点。

参考

  • http://blog.csdn.net/han_xiaoyang/article/details/49123419
  • http://blog.csdn.net/zjuPeco/article/details/77165974
  • http://blog.csdn.net/star_liux/article/details/39666737

股票买卖

发表于 2019-01-10 | Edited on 2023-03-05 | 分类于 算法设计与分析

题目来源:http://bailian.openjudge.cn/practice/4121/

解题思路

  • 假设股票数组为prices
  • 设F[k][i]表示到第i天总共买卖k次时的最大利润,可以将其分为两种情况,即第i天卖出股票和未卖出股票。
  • 假如第i天没有卖出股票,F[k][i] = F[k][i-1]
  • 假如第i天卖出了股票,那么F[k][i] = max{prices[i] - prices[t]+F[k-1][t]},为什么是这个推导公式,因为假如F[k][i]的最优解是,第x天是k-1次的卖出,随后的第y天又买入,第i天卖出,于是F[k][i] = F[k-1][x]+prices[i]- prices[y](x<= y <=i),此时必然有F[k-1][x] =F[k-1][y],证明如下:
    • 很显然,F[k-1][y]>=F[k-1][x],假设F[k-1][y]>F[k-1][x],此时必然有F[k-1][y]+prices[i]-prices[y]>F[k][i] = F[k-1][x]+prices[i]- prices[y],这与最优解矛盾,因此必然有F[k-1][x] =F[k-1][y],因此F[k][i]的推导公式可以写成max{prices[i] - prices[t]+F[k-1][t]}。
  • 对上述进行优化,max{prices[i] - prices[t]+F[k-1][t]} = prices[i] +max{F[k-1][t]-prices[t]}; (0<=t<=i-1), 对于确定的i和k,每次求max{F[k-1][t]-prices[t]}都需要对t从1到i进行遍历,于是可以在循环中,求解时用一个临时变量tmp记录max{F[k-1][t]-prices[t]},t属于[0,i-1],每次i增量时比较tmp和F[k-1][i]-prices[i]和tmp的较大值赋给tmp,再进行求解。

AC代码

代码中nums即为解题思路中的prices

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <vector>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <climits>
#include <string>
#include <algorithm>

using namespace std;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef const int CI;

int solution(const VI& nums, CI K) {
VVI F(K + 1, VI(nums.size(), 0));
for (int k = 1; k <= K; ++k) {
int tmp = F[k - 1][0] - nums[0];
for (int i = 1; i < nums.size(); ++i) {
tmp = max(F[k-1][i] - nums[i], tmp);
F[k][i] = max(F[k][i - 1], nums[i] + tmp);
}
}
return F[K][nums.size() - 1];
}

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int castCount; cin >> castCount;
while (castCount--) {
int N;
cin >> N;
VI nums(N, 0);
for (auto&e : nums)
cin >> e;
int ans = solution(nums,2);
cout << ans << endl;
}
return 0;
}

最小路径覆盖

发表于 2019-01-09 | Edited on 2023-03-05 | 分类于 算法设计与分析

题目来源:http://algorithm.openjudge.cn/2017mock/H/

解题思路:

  • 对于图G = (V,E)来说使用最少的路径,使得这些路径中的顶点互不相交并且这些路径中顶点的集合恰好时这个图的顶点。
  • 假设一条路径都没有,此时覆盖原图需要|V|条路径(每个顶点算作一个路径)。
  • 一旦两个顶点之间存在1条路径,那么需要的路径就会减少1条,因为1条边可以覆盖2个顶点。因此如果有K条这样的路径,那么就能够减少K条路径(1条路径可以减少额外的1个用于覆盖的顶点)。
  • 网上大神特别巧妙的思路,将一个定点划分为两部分,V划分为V1和V2, 将V1视作出边,V2视作入边。假如顶点U和V之间有连边,则连接U1和V2,将所有的出边和超级源点S连接,容量为1,将所有的入边和超级汇点T连接,容量为1,求该网络流的最大流,最后用|V|-maxFlow即为最小的路径覆盖数。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
* Dinic algo for max flow
*
* This implementation assumes that #nodes, #edges, and capacity on each edge <= INT_MAX,
* which means INT_MAX is the best approximation of INF on edge capacity.
* The total amount of max flow computed can be up to LLONG_MAX (not defined in this file),
* but each 'dfs' call in 'dinic' can return <= INT_MAX flow value.
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <assert.h>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>

#define N (1000+2)
#define M (2*N*N+4*N)

using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef const int CI;

struct edge {
int v, cap, next;
};
edge e[M];

int head[N], level[N], cur[N];
int num_of_edges;

/*
* When there are multiple test sets, you need to re-initialize before each
*/
void dinic_init(void) {
num_of_edges = 0;
memset(head, -1, sizeof(head));
return;
}

int add_edge(int u, int v, int c1, int c2) {
int& i = num_of_edges;

assert(c1 >= 0 && c2 >= 0 && c1 + c2 >= 0); // check for possibility of overflow
e[i].v = v;
e[i].cap = c1;
e[i].next = head[u];
head[u] = i++;

e[i].v = u;
e[i].cap = c2;
e[i].next = head[v];
head[v] = i++;
return i;
}

void print_graph(int n) {
for (int u = 0; u < n; u++) {
printf("%d: ", u);
for (int i = head[u]; i >= 0; i = e[i].next) {
printf("%d(%d)", e[i].v, e[i].cap);
}
printf("\n");
}
return;
}

/*
* Find all augmentation paths in the current level graph
* This is the recursive version
*/
int dfs(int u, int t, int bn) {
if (u == t) return bn;
int left = bn;
for (int &i = cur[u]; i >= 0; i = e[i].next) {
int v = e[i].v;
int c = e[i].cap;
if (c > 0 && level[u] + 1 == level[v]) {
int flow = dfs(v, t, min(left, c));
if (flow > 0) {
e[i].cap -= flow;
e[i ^ 1].cap += flow;
cur[u] = i;
left -= flow;
if (!left) break;
}
}
}
if (left > 0) level[u] = 0;
return bn - left;
}

bool bfs(int s, int t) {
memset(level, 0, sizeof(level));
level[s] = 1;
queue<int> q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
if (u == t) return true;
for (int i = head[u]; i >= 0; i = e[i].next) {
int v = e[i].v;
if (!level[v] && e[i].cap > 0) {
level[v] = level[u] + 1;
q.push(v);
}
}
}
return false;
}

LL dinic(int s, int t) {
LL max_flow = 0;

while (bfs(s, t)) {
memcpy(cur, head, sizeof(head));
max_flow += dfs(s, t, INT_MAX);
}
return max_flow;
}

int upstream(int s, int n) {
int cnt = 0;
vector<bool> visited(n);
queue<int> q;
visited[s] = true;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = head[u]; i >= 0; i = e[i].next) {
int v = e[i].v;
if (e[i].cap > 0 && !visited[v]) {
visited[v] = true;
q.push(v);
cnt++;
}
}
}
return cnt; // excluding s
}


int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int m, n;
cin >> m >> n;
int s = 0, t = 2 * n + 1;
dinic_init();
for (int i = 0; i < m; ++i) {
int a, b; cin >> a >> b;
add_edge(a, b + n, 1, 0);
}
for (int i = 0; i < n; ++i) {
add_edge(s, i + 1, 1, 0);
add_edge(i + n + 1, t, 1, 0);
}
LL maxFlow = dinic(s, t);
printf("%lld\n",n - maxFlow);
}
// 参考:https://blog.csdn.net/pengwill97/article/details/82765383

昂贵的聘礼

发表于 2019-01-09 | Edited on 2023-03-05 | 分类于 算法设计与分析

题目来源:http://bailian.openjudge.cn/practice/1062/

解题思路:

- 假设冒险家自身是第0号物品,可以将这道题目理解为经过一系列的物品的交换,花费最少的金币换得酋长的1号物品。
-将其看作图论,建图的时候,每次遇到一个物品及其原价,可以设置0号物品到该物品的距离为该物品的价值。即表明冒险家直接购买物品需要花费的金币。
- 对于某个物品的替代品,可以设置为替代品的编号到原物品编号之间的花费为“优惠价格”,无论经过多少次交换,最后必须和酋长进行交换,而酋长对冒险家交换过的物品等级有限制,假设酋长的地位为Q,可以忍受的等级差距为M,那么就可以枚举等级差距为M的等级范围。即[Q-M, Q],[Q-M+1, Q+1]...[Q, Q+M]。
- 将所有等级限制范围内可以交换花费的最小金币求取最小值,即为最少花费的金币。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <climits>
#include <queue>
#include <cstdio>

using namespace std;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef const int CI;

struct Gift {
int level;
int value;
Gift(int l = 0, int v = 0) :level(l), value(v) {};
};

struct Edge {
int from, to;
int dis;
Edge(int f, int t, int d) :from(f), to(t), dis(d) {}
bool operator<(const Edge& e)const { return this->dis > e.dis; };
};

// dijkstra 算法,low和high分别表示等级范围
int solution(const VVI& graph, const vector<Gift>& gift, CI low, CI high) {
VI dis(graph.size(), INT_MAX);
dis[0] = 0;
priority_queue<Edge> myQueue;
// 每次加入边的时候考虑等级差距
for (int i = 1; i < graph.size(); ++i){
if (gift[i].level >= low&&gift[i].level <= high)
dis[i] = graph[0][i];
else
dis[i] = INT_MAX;
myQueue.push(Edge(0, i, dis[i]));
}
VI visit(graph.size(), 0);
visit[0] = 1;
while (!myQueue.empty()) {
Edge e = myQueue.top();
myQueue.pop();
if (visit[e.to] == 1)
continue;
visit[e.to] = 1;
dis[e.to] = e.dis;
for (int j = 1; j < graph.size(); ++j) {
// 每次加入边的时候考虑等级差距
if (visit[j] == 0 && gift[j].level >= low&&gift[j].level <= high&&dis[e.to] < dis[j] - graph[e.to][j])
myQueue.push(Edge(e.to, j, dis[e.to] + graph[e.to][j]));
}
}
return dis[1];
}

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int M, N;
while (cin >> M >> N) {
vector<Gift> gift(N + 1);

VVI graph(N + 1, VI(N + 1, INT_MAX));
for (int i = 0; i < N + 1; ++i)
graph[i][i] = 0;

for (int i = 1; i <= N; ++i) {
int alter;
cin >> gift[i].value >> gift[i].level >> alter;
graph[0][i] = gift[i].value;
for (int j = 0; j < alter; ++j) {
int x, y;
cin >> x >> y;
graph[x][i] = y;
}
}
CI L = gift[1].level;
int ans = INT_MAX;
for (int i = 0; i <= M; ++i) {
int tmp = solution(graph, gift, L - i, L - i + M);
ans = min(ans, tmp);
}
printf("%d\n", ans);
}
return 0;
}

Checking an Alibi 测试数据集

发表于 2018-12-11 | Edited on 2023-03-05 | 分类于 算法设计与分析

题目来源

http://bailian.openjudge.cn/practice/2394/

解题思路

  • 这道题目就是计算从源点1到其他顶点之间的最短距离,使用Dijkstra算法即可实现,然后判断每头牛所在的点,判断其和源点1之间的距离是否不超过M。
  • 代码运行了很多遍之后发现老是出错,最后发现测试数据集中会出现重复的边,比如2 3 1,表示2号顶点到3号顶点距离为1,但是还会出现2 3 100,表示2号顶点到3号顶点最短距离是100,我的输入中构造图的时候就会更新为2号到3号的距离为100,但是实际计算按照1来计算,因此,读取P条边的时候,采用如下代码读取每条边的距离,结果一直无法通过。
1
2
3
scanf("%d%d%d",&x, &y, &w);
graph[x][y] = w;
graph[y][x] = w;

最后知道了错误后改用如下读取方式,最终AC了。

1
2
3
scanf("%d%d%d",&x, &y, &w);
graph[x][y] = min(graph[x][y],w);
graph[y][x] = min(graph[y][x], w);
  • 这算是一个经验教训吧,以后读取图的边的时候,不要随时更新,读取两个顶点的距离时,保存最小值就好。

算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<vector>
#include<cstdio>
#include<queue>
#include<queue>
#include<functional>
using namespace std;

// 表示边的结构体
struct Edge {
int from, to, distance;
Edge(int f, int t, int d) :from(f), to(t), distance(d) {};
bool operator <(const Edge& e)const { return this->distance > e.distance; };
};

// 计算从source出发,到图中每个顶点的最短距离
void dijkstra(const vector<vector<int>>& graph, const int source, vector<int>& distance) {
vector<int> visit(graph.size(), 0);
priority_queue<Edge> myQueue;
visit[0] = 1;
visit[source] = 1;
for (int i = 1; i < graph.size(); ++i)
if(visit[i]==0)
myQueue.emplace(source, i, distance[i]);

while (!myQueue.empty()) {
Edge e = myQueue.top();
myQueue.pop();
if (visit[e.to] == 1)
continue;
visit[e.to] = 1;
distance[e.to] = e.distance;
for (int j = 1; j < graph.size(); ++j) {
if (visit[j] == 0 && distance[e.to] + graph[e.to][j] < distance[j]){
myQueue.emplace(e.to, j, distance[e.to] + graph[e.to][j]);
}
}
}
}


int main() {
int F, P, C, M;
while (scanf("%d%d%d%d", &F, &P, &C, &M) != EOF) {
vector<vector<int>> graph(F + 1, vector<int>(F + 1, static_cast<int>(1e9)));
for (int i = 0; i < graph.size(); ++i)
graph[i][i] = 0;
for (int i = 0; i < P; ++i) {
int x, y, w;
scanf("%d%d%d",&x, &y, &w);
graph[x][y] = min(graph[x][y],w);
graph[y][x] = min(graph[y][x], w);
}
vector<int> cows(C, 0);
for (int j = 0; j < C; ++j)
scanf("%d",&cows[j]);
vector<int> distance(graph[1]);
dijkstra(graph, 1,distance);
int ans = 0;
for (int i = 0; i < cows.size(); ++i)
if (distance[cows[i]] <= M)
++ans;
printf("%d\n",ans);
for (int i = 0; i < cows.size(); ++i)
if (distance[cows[i]] <= M)
printf("%d\n",i+1);
}
return 0;
}

测试数据集

  • test case 1—input
1
2
3
4
5
6
7
8
9
10
11
12
7 6 5 8
1 4 2
1 2 1
2 3 6
3 5 5
5 4 6
1 7 9
1
4
5
3
7
  • test case 1—output
1
2
3
4
5
4
1
2
3
4

  • test case 2—input
1
2
3
1 1 1 1
1 1 1
1
  • test case 2—output
1
2
1
1

  • test case 3—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
11 10 10 20
2 1 11
3 1 12
4 1 13
5 1 14
6 1 15
7 1 16
8 1 18
9 1 19
10 1 20
11 1 10
2
3
4
5
6
7
8
9
10
11
  • test case 3—output
1
2
3
4
5
6
7
8
9
10
11
10
1
2
3
4
5
6
7
8
9
10

  • test case 4—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3 2 10 4
1 2 3
3 1 10
2
2
2
2
3
3
3
2
2
2

  • test case 4—output
1
2
3
4
5
6
7
8
9
7
1
2
3
4
8
9
10


  • test case 5—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
11 22 12 69999
1 2 69998
2 3 100
2 3 1
2 3 100
2 4 100
2 4 1
2 4 100
2 5 100
2 5 1
2 5 100
2 6 100
2 6 1
2 6 100
2 7 100
2 7 1
2 7 100
2 8 1
2 8 100
2 9 100
2 9 1
2 10 1
2 11 2
1
2
3
4
11
5
6
7
8
9
9
10
  • test case 5—output
1
2
3
4
5
6
7
8
9
10
11
12
11
1
2
3
4
6
7
8
9
10
11
12

  • test case 6—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
5 5 10 100
1 2 50
2 3 50
3 4 50
4 5 50
2 5 10
1
2
3
4
5
5
4
3
2
1
  • test case 6—output
1
2
3
4
5
6
7
8
9
8
1
2
3
5
6
8
9
10

  • test case 7—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
10 10 11 70000
1 2 10000
2 3 10000
3 4 10000
4 5 10000
5 6 10000
6 7 10000
7 8 10000
8 9 10000
9 5 10000
5 7 10000
6
5
4
7
7
8
9
3
2
1
10
  • test case 7—output
1
2
3
4
5
6
7
8
9
10
11
10
1
2
3
4
5
6
7
8
9
10

  • test case 8—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
50 100 50 1000
43 10 336
19 34 625
11 36 300
36 24 4
4 39 546
43 36 973
37 39 967
37 31 531
8 18 843
5 9 86
28 48 115
32 28 81
18 37 699
40 27 695
11 50 185
45 47 610
28 38 167
39 44 848
23 4 311
33 2 712
7 8 150
15 3 100
30 23 329
13 23 730
29 3 927
48 46 329
13 5 994
19 41 465
2 25 825
34 12 923
6 31 569
13 16 550
46 36 995
17 35 647
18 47 154
29 19 335
27 46 432
15 12 704
16 30 232
22 47 18
50 15 362
35 36 620
8 24 506
21 36 570
21 36 503
47 12 409
38 33 452
7 40 272
42 18 552
29 26 500
27 13 398
44 9 766
46 32 993
37 12 699
5 2 671
50 5 865
11 22 278
11 7 689
21 35 253
15 14 823
18 14 90
46 11 512
10 16 17
33 16 743
9 43 181
43 7 43
47 22 194
45 7 606
1 6 637
18 25 661
12 21 37
16 1 440
23 6 188
13 2 251
39 29 519
36 43 183
32 35 477
32 30 54
14 23 85
15 46 176
20 49 330
30 46 70
24 44 538
9 1 217
30 23 16
36 39 141
5 4 825
41 30 31
45 16 762
34 21 37
31 17 1
21 18 563
29 21 341
10 39 55
16 34 803
24 39 24
25 38 240
45 16 484
40 41 901
9 45 232
15
31
22
38
35
40
34
12
45
33
37
41
21
18
18
30
42
24
26
31
41
29
21
41
31
23
9
15
44
33
43
16
29
16
33
43
12
21
27
9
12
21
32
33
5
49
23
3
43
35

  • test case 8—output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
24
1
4
6
9
12
14
15
16
18
21
24
26
27
28
29
31
32
34
36
40
43
45
47
49

  • test case 9—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
500 100 100 70000
244 51 1
285 491 1
497 30 1
196 105 1
430 202 1
397 155 1
39 236 1
257 19 1
395 122 1
75 91 1
364 55 1
77 451 1
44 322 1
374 430 1
83 200 1
207 70 1
100 488 1
434 430 1
315 383 1
270 146 1
157 238 1
147 241 1
406 114 1
460 273 1
361 344 1
290 76 1
485 343 1
257 346 1
424 439 1
72 396 1
240 135 1
187 127 1
297 297 1
242 376 1
145 214 1
422 342 1
449 428 1
173 53 1
219 151 1
113 177 1
323 468 1
23 96 1
207 401 1
179 403 1
322 94 1
131 331 1
185 328 1
143 183 1
429 193 1
350 2 1
332 297 1
61 327 1
483 317 1
365 247 1
117 237 1
118 108 1
373 203 1
156 54 1
488 212 1
338 490 1
117 475 1
402 217 1
316 94 1
247 364 1
34 18 1
476 333 1
210 368 1
398 9 1
106 275 1
15 47 1
71 201 1
122 170 1
27 109 1
236 454 1
222 137 1
259 244 1
89 328 1
52 28 1
441 183 1
307 328 1
2 194 1
153 495 1
69 78 1
252 293 1
379 158 1
370 279 1
426 376 1
295 234 1
230 329 1
191 482 1
406 201 1
10 351 1
311 280 1
460 10 1
331 450 1
204 498 1
227 247 1
166 64 1
179 476 1
22 296 1
185
218
34
78
277
87
371
336
21
342
118
423
229
132
441
66
355
447
50
227
45
96
210
284
100
245
388
32
126
213
157
459
6
334
342
102
279
300
445
1
400
293
37
318
181
154
108
425
423
346
63
273
308
74
62
498
440
205
498
305
133
472
176
415
365
25
115
420
120
353
85
294
123
279
1
493
395
43
148
37
313
358
345
280
459
34
420
236
409
254
209
102
456
42
270
473
462
285
167
105

  • test case 9—output
1
2
3
2
40
75

  • test case 10—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
50 1000 100 69999
15 13 70000
42 48 70000
48 47 70000
25 50 70000
34 31 70000
28 16 70000
26 28 70000
6 48 70000
14 46 70000
26 38 70000
27 2 70000
5 40 70000
43 35 70000
29 12 70000
37 14 70000
10 10 70000
40 37 70000
13 7 70000
27 22 70000
42 15 70000
20 44 42351
7 38 70000
47 20 70000
36 22 70000
48 40 70000
20 8 70000
23 48 70000
10 23 70000
35 6 70000
25 2 70000
29 30 70000
1 34 25649
4 45 70000
8 30 70000
24 3 25772
41 2 70000
43 49 70000
29 47 70000
1 26 46450
32 17 70000
25 12 70000
2 43 70000
41 37 57658
15 45 70000
4 50 70000
16 33 70000
27 19 70000
12 2 70000
32 18 70000
2 22 70000
28 37 70000
43 24 70000
1 14 34964
21 9 70000
44 34 70000
18 11 70000
47 50 70000
27 1 70000
11 43 70000
4 25 70000
50 7 70000
30 36 70000
45 15 70000
50 48 70000
2 17 70000
37 33 70000
37 28 70000
10 34 70000
21 5 70000
14 12 70000
30 36 70000
3 18 70000
25 42 9223
29 11 70000
18 40 70000
30 18 70000
22 34 70000
42 5 70000
1 9 70000
50 23 70000
44 18 70000
4 36 70000
9 36 70000
32 47 70000
13 44 70000
45 14 70000
12 39 70000
14 41 70000
23 43 70000
41 35 66210
21 31 69450
11 1 70000
15 41 70000
8 20 70000
23 16 70000
13 13 70000
47 25 70000
27 11 70000
10 24 70000
15 11 70000
32 12 58003
5 37 70000
40 33 70000
41 38 70000
47 37 70000
21 48 70000
44 12 70000
20 31 70000
8 27 70000
2 49 70000
38 33 70000
6 27 70000
33 11 70000
16 32 70000
44 36 70000
34 37 70000
49 10 70000
44 10 70000
23 9 70000
12 19 70000
5 37 70000
41 47 70000
17 28 70000
30 17 70000
29 19 70000
39 26 70000
46 47 70000
35 34 70000
7 17 70000
50 36 70000
32 3 70000
21 40 70000
41 41 70000
29 35 70000
46 31 70000
43 24 70000
19 27 70000
15 24 70000
12 2 70000
23 1 70000
3 48 70000
22 5 70000
41 44 70000
41 13 70000
8 13 70000
22 10 70000
3 23 70000
9 45 70000
47 4 70000
37 23 70000
35 27 70000
44 44 70000
17 34 70000
5 34 70000
25 2 70000
33 15 70000
23 31 70000
20 24 39168
7 3 70000
26 31 70000
2 40 70000
44 48 70000
43 28 70000
46 29 70000
7 15 70000
8 43 70000
38 42 31588
13 49 70000
9 33 70000
1 29 70000
11 22 70000
43 29 70000
47 33 70000
28 45 70000
8 8 70000
16 16 70000
12 34 70000
10 17 70000
27 24 70000
10 20 70000
12 2 70000
14 48 70000
45 35 70000
23 14 70000
35 12 70000
49 45 70000
11 3 70000
24 33 70000
17 33 70000
12 23 70000
29 24 70000
6 24 70000
9 29 70000
47 35 70000
20 41 70000
37 6 70000
7 40 70000
48 10 70000
24 31 70000
2 34 70000
27 23 70000
32 12 70000
46 43 70000
23 7 70000
40 9 70000
7 10 70000
39 9 5401
14 46 70000
20 45 70000
18 23 70000
38 36 70000
39 5 70000
50 6 70000
2 39 70000
41 43 49787
40 34 70000
46 25 18391
7 33 70000
1 13 70000
7 24 70000
2 42 70000
27 14 70000
10 33 70000
7 28 70000
24 5 70000
44 38 70000
30 41 70000
9 10 70000
48 49 70000
24 5 70000
3 4 70000
1 5 70000
7 12 50231
48 25 70000
36 32 70000
46 27 70000
18 10 70000
13 38 70000
25 28 70000
10 17 70000
40 1 70000
23 40 70000
5 48 70000
38 47 70000
32 29 70000
3 6 70000
17 40 70000
39 38 70000
27 7 70000
43 10 70000
32 19 70000
21 9 70000
29 25 70000
32 3 70000
46 47 70000
39 43 70000
22 19 70000
50 31 70000
29 50 70000
32 32 70000
48 33 70000
24 24 70000
43 49 70000
40 10 70000
43 3 70000
34 2 70000
34 19 70000
4 46 70000
16 33 70000
21 5 70000
33 12 70000
36 13 70000
39 43 70000
20 26 70000
49 34 70000
43 36 70000
15 12 70000
40 49 70000
36 2 70000
42 21 12130
4 41 70000
38 20 70000
10 16 70000
34 39 70000
17 13 70000
47 34 70000
29 7 70000
16 9 70000
17 49 70000
18 33 70000
40 26 70000
36 30 70000
23 22 70000
25 22 70000
48 48 70000
39 21 70000
3 36 70000
30 43 70000
38 10 56654
6 6 70000
45 40 70000
11 16 70000
23 22 70000
47 48 70000
14 44 70000
43 25 8359
8 43 70000
13 19 70000
50 25 70000
17 10 70000
8 11 70000
8 31 70000
41 23 70000
29 7 70000
41 28 20261
11 33 70000
16 41 70000
16 7 70000
17 27 70000
40 50 70000
12 42 70000
31 42 70000
22 13 70000
14 47 70000
31 16 70000
43 44 70000
19 48 70000
16 44 70000
3 7 70000
33 40 70000
17 30 70000
46 16 70000
11 48 70000
9 4 32110
2 20 70000
34 17 24471
38 39 70000
22 7 70000
31 46 70000
17 37 70000
46 8 51655
33 50 70000
17 17 70000
43 15 70000
17 49 70000
14 7 70000
16 7 70000
27 24 70000
1 17 70000
13 37 70000
30 23 70000
46 36 70000
12 23 70000
2 47 70000
13 44 70000
38 6 70000
23 16 70000
5 29 70000
10 8 70000
43 16 70000
5 14 64476
3 47 70000
24 8 70000
16 33 70000
46 13 70000
11 29 70000
24 34 70000
32 36 70000
8 48 70000
33 34 70000
38 42 70000
5 39 70000
15 44 70000
24 45 70000
14 11 70000
45 34 55601
16 40 70000
50 29 70000
32 8 70000
16 44 70000
10 29 70000
19 8 70000
27 50 70000
12 35 70000
19 30 70000
31 17 70000
20 25 70000
32 46 70000
6 41 70000
44 8 70000
29 45 70000
16 9 70000
25 14 70000
5 47 70000
33 41 70000
23 9 70000
30 1 70000
13 43 70000
14 15 70000
31 26 70000
10 29 70000
38 28 70000
10 13 70000
39 25 70000
32 13 70000
46 16 70000
2 44 70000
40 27 70000
17 47 70000
34 12 70000
3 31 70000
12 1 11365
14 17 70000
50 14 70000
45 24 70000
21 32 70000
43 29 70000
12 18 70000
32 28 70000
45 42 70000
8 13 70000
26 37 70000
30 14 70000
16 22 70000
16 8 70000
6 17 70000
11 9 70000
7 30 70000
23 9 70000
13 44 70000
45 14 70000
30 33 70000
36 34 70000
14 16 70000
40 40 70000
2 3 70000
14 45 70000
43 19 70000
44 8 70000
13 46 70000
45 40 70000
15 25 70000
13 47 70000
21 3 70000
38 39 70000
38 48 70000
32 3 70000
43 33 70000
46 1 70000
35 4 70000
27 7 70000
43 24 70000
6 17 70000
41 17 70000
49 34 70000
42 25 67081
12 37 70000
12 29 70000
1 6 70000
8 30 70000
44 15 70000
32 50 70000
39 14 70000
43 40 22715
30 40 70000
20 26 70000
22 28 70000
13 37 70000
26 42 70000
3 22 70000
15 3 70000
31 37 70000
20 24 70000
39 41 70000
11 44 70000
45 27 70000
8 50 70000
21 32 70000
36 2 70000
13 47 70000
47 6 70000
7 40 70000
6 26 70000
47 18 70000
11 28 70000
31 43 70000
40 48 70000
23 50 70000
43 5 18256
8 13 70000
12 34 70000
31 45 70000
6 37 70000
5 15 70000
17 18 70000
47 27 70000
21 22 70000
13 12 70000
42 24 70000
31 2 70000
2 49 70000
48 47 70000
15 26 70000
3 46 70000
16 45 70000
39 50 70000
43 45 70000
24 22 70000
49 28 70000
37 35 70000
34 14 70000
43 44 70000
13 26 70000
8 41 70000
20 18 70000
40 39 70000
10 26 70000
26 1 70000
48 28 70000
15 29 56279
16 19 70000
36 47 70000
5 7 20142
27 33 70000
44 14 70000
31 12 70000
24 49 70000
37 11 70000
41 19 70000
38 26 70000
10 4 70000
8 35 70000
36 47 70000
18 36 70000
38 47 68543
39 20 70000
20 22 70000
36 47 70000
31 2 70000
40 26 70000
11 13 70000
25 40 70000
26 21 31323
14 41 70000
17 29 70000
12 2 70000
20 46 70000
13 10 70000
15 9 70000
21 40 70000
24 12 58373
20 23 70000
17 48 70000
27 8 70000
36 15 70000
50 45 70000
11 46 70000
7 11 23623
11 14 70000
19 35 50735
33 36 70000
27 24 70000
1 8 70000
32 38 70000
4 47 70000
29 47 70000
3 48 70000
39 29 70000
5 14 70000
3 18 70000
35 21 70000
41 2 70000
48 35 70000
31 48 70000
12 7 70000
8 23 70000
20 12 70000
50 45 70000
6 44 70000
44 27 70000
24 6 70000
15 40 70000
49 48 70000
39 14 70000
20 2 70000
24 8 70000
4 8 70000
42 10 70000
5 11 70000
14 19 70000
29 11 70000
9 40 70000
40 29 70000
20 15 70000
26 37 70000
18 29 70000
34 3 70000
38 16 70000
27 6 70000
39 39 70000
44 18 36647
34 39 70000
13 46 70000
11 40 70000
20 16 70000
18 31 70000
36 6 70000
25 26 70000
27 22 70000
40 45 70000
43 21 70000
8 9 31897
32 43 70000
35 3 70000
28 4 70000
4 20 70000
28 32 70000
7 31 70000
48 27 70000
44 15 70000
19 38 70000
32 16 70000
37 14 70000
20 40 70000
37 40 70000
42 46 70000
20 45 70000
44 49 70000
27 27 70000
21 48 70000
22 37 70000
34 1 70000
44 3 70000
21 29 70000
17 39 70000
31 38 70000
1 7 70000
35 15 70000
18 14 70000
34 24 70000
20 45 70000
5 31 70000
32 36 70000
13 33 70000
15 41 70000
22 49 70000
3 42 70000
30 33 70000
21 49 32764
2 13 70000
1 16 70000
33 3 70000
20 7 70000
17 9 70000
26 2 70000
13 23 70000
38 7 70000
7 32 70000
6 49 70000
31 9 7007
18 21 70000
8 28 70000
34 35 70000
3 47 70000
22 18 70000
46 15 70000
34 12 70000
22 37 70000
11 47 70000
37 23 70000
42 30 70000
10 17 70000
10 33 59253
50 22 70000
48 36 70000
33 10 70000
50 33 70000
5 27 70000
40 12 70000
17 30 70000
25 11 70000
6 20 70000
44 30 70000
32 20 70000
5 2 70000
1 27 70000
47 6 70000
24 6 70000
4 24 52172
20 13 70000
23 36 70000
12 1 70000
34 14 70000
42 8 70000
49 20 39251
18 42 70000
45 42 70000
20 49 70000
12 48 70000
31 40 70000
48 5 70000
19 41 70000
39 6 70000
3 18 70000
14 45 70000
41 27 70000
20 19 70000
3 2 70000
18 10 70000
35 29 70000
25 2 43307
3 5 70000
42 36 70000
38 17 70000
18 13 70000
1 21 70000
35 50 70000
4 33 70000
12 9 70000
12 18 70000
21 34 61567
17 17 70000
44 31 70000
12 43 70000
48 16 70000
34 19 70000
47 30 70000
3 3 70000
17 7 70000
49 45 70000
34 43 70000
5 36 70000
4 1 70000
43 47 70000
32 33 70000
4 4 70000
6 23 70000
42 34 70000
49 11 70000
20 14 70000
42 30 70000
12 30 70000
38 15 70000
23 24 70000
16 21 70000
3 41 70000
33 34 70000
50 32 70000
39 3 70000
24 29 70000
1 8 14922
34 41 70000
32 10 70000
46 49 70000
40 13 70000
47 42 70000
28 20 70000
47 49 70000
21 30 70000
25 22 52878
33 14 70000
36 6 61445
27 23 70000
50 7 70000
25 6 70000
35 9 70000
14 32 70000
26 8 70000
45 37 70000
39 15 70000
3 11 70000
2 41 70000
50 11 70000
11 23 70000
40 1 42369
26 48 70000
40 2 70000
35 5 70000
40 41 70000
28 22 36519
6 12 70000
33 29 70000
33 31 70000
37 20 70000
35 25 70000
32 27 70000
42 1 70000
49 36 37672
34 35 70000
23 9 70000
42 3 70000
33 50 70000
20 20 40293
13 28 70000
13 27 70000
36 39 70000
49 17 70000
25 1 70000
42 36 70000
43 27 70000
19 13 70000
36 16 70000
50 7 70000
48 35 70000
36 33 70000
13 26 70000
35 7 70000
37 35 70000
2 9 70000
8 17 70000
42 15 70000
45 21 70000
42 42 70000
50 22 70000
50 23 70000
29 36 70000
36 16 70000
42 47 70000
7 27 56677
4 13 70000
3 5 70000
41 1 70000
42 15 70000
38 42 70000
1 13 70000
15 47 70000
3 32 70000
30 19 25996
3 23 70000
2 37 70000
20 20 70000
47 21 70000
20 30 70000
39 21 70000
29 6 70000
20 28 70000
35 33 70000
29 44 70000
43 44 70000
35 9 70000
37 15 70000
20 25 6496
24 4 70000
6 10 70000
14 27 70000
28 8 70000
18 24 70000
13 2 70000
23 22 70000
30 5 70000
14 33 70000
12 49 70000
44 8 70000
22 38 70000
44 18 68081
33 7 70000
2 20 70000
30 5 70000
32 32 70000
28 32 70000
17 31 70000
16 16 70000
41 28 58544
1 26 70000
36 48 70000
1 42 70000
48 36 70000
11 26 70000
49 47 70000
27 48 447
1 18 70000
23 2 70000
1 32 11950
44 23 70000
22 49 46018
35 2 70000
12 21 4682
15 17 70000
31 23 70000
10 10 70000
41 32 70000
34 40 70000
32 4 70000
21 28 70000
7 5 70000
6 8 70000
4 10 70000
5 27 70000
21 46 70000
36 14 70000
30 9 70000
17 45 53013
43 44 70000
48 49 70000
19 44 70000
19 7 70000
28 11 70000
10 33 70000
27 15 70000
44 2 70000
43 2 70000
9 8 70000
24 24 70000
12 18 70000
9 46 70000
8 41 70000
9 37 70000
19 41 47051
46 34 70000
21 5 70000
36 6 70000
36 15 70000
34 1 70000
47 26 70000
6 33 70000
21 34 70000
22 1 70000
33 35 41278
6 47 70000
40 21 70000
40 41 70000
21 37 70000
41 15 70000
33 43 70000
7 44 70000
19 33 70000
35 12 70000
40 35 70000
11 23 70000
47 41 70000
13 36 29655
6 18 70000
33 7 70000
32 45 70000
42 10 70000
1 25 16284
48 10 70000
35 40 56206
22 7 70000
24 50 70000
10 22 70000
18 39 70000
17 27 70000
21 13 70000
47 18 70000
44 3 70000
18 9 21396
20 15 70000
12 20 70000
41 50 70000
18 13 70000
13 36 70000
14 11 70000
39 20 70000
25 38 70000
48 4 70000
2 25 70000
24 12 70000
16 1 70000
29 44 70000
35 5 70000
22 19 70000
39 25 70000
7 47 18704
47 34 70000
41 34 70000
1 48 70000
20 3 70000
43 10 70000
20 43 70000
2 27 70000
46 41 70000
33 47 70000
47 43 70000
48 24 70000
31 4 70000
38 1 70000
37 44 70000
24 42 70000
27 31 70000
17 35 69703
27 41 70000
46 30 70000
36 32 70000
39 43 70000
44 41 70000
8 37 70000
7 18 70000
17 42 70000
1 42 70000
32 15 70000
23 10 70000
10 19 70000
38 28 70000
14 10 70000
32 17 70000
32 12 70000
30 32 70000
39 31 70000
19 37 70000
7
50
35
9
23
8
28
17
50
33
26
20
1
5
26
50
50
12
42
6
47
30
3
48
50
46
47
32
10
17
1
23
48
20
16
18
3
14
49
13
25
22
7
38
34
22
36
15
46
32
26
19
3
39
18
4
29
43
50
44
13
48
28
26
30
15
27
3
20
48
19
17
33
36
31
36
11
21
3
17
47
14
7
43
32
50
41
29
1
14
21
22
31
14
9
16
46
14
37
20

  • test case 10—output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
52
1
4
6
8
11
12
13
14
15
18
19
26
28
30
31
34
36
38
39
41
42
43
44
45
46
49
50
51
54
55
58
60
64
69
72
75
78
80
82
83
84
85
89
90
91
92
93
94
95
97
98
100

  • test case 11—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
500 499 100 70000
1 2 141
2 3 141
3 4 141
4 5 141
5 6 141
6 7 141
7 8 141
8 9 141
9 10 141
10 11 141
11 12 141
12 13 141
13 14 141
14 15 141
15 16 141
16 17 141
17 18 141
18 19 141
19 20 141
20 21 141
21 22 141
22 23 141
23 24 141
24 25 141
25 26 141
26 27 141
27 28 141
28 29 141
29 30 141
30 31 141
31 32 141
32 33 141
33 34 141
34 35 141
35 36 141
36 37 141
37 38 141
38 39 141
39 40 141
40 41 141
41 42 141
42 43 141
43 44 141
44 45 141
45 46 141
46 47 141
47 48 141
48 49 141
49 50 141
50 51 141
51 52 141
52 53 141
53 54 141
54 55 141
55 56 141
56 57 141
57 58 141
58 59 141
59 60 141
60 61 141
61 62 141
62 63 141
63 64 141
64 65 141
65 66 141
66 67 141
67 68 141
68 69 141
69 70 141
70 71 141
71 72 141
72 73 141
73 74 141
74 75 141
75 76 141
76 77 141
77 78 141
78 79 141
79 80 141
80 81 141
81 82 141
82 83 141
83 84 141
84 85 141
85 86 141
86 87 141
87 88 141
88 89 141
89 90 141
90 91 141
91 92 141
92 93 141
93 94 141
94 95 141
95 96 141
96 97 141
97 98 141
98 99 141
99 100 141
100 101 141
101 102 141
102 103 141
103 104 141
104 105 141
105 106 141
106 107 141
107 108 141
108 109 141
109 110 141
110 111 141
111 112 141
112 113 141
113 114 141
114 115 141
115 116 141
116 117 141
117 118 141
118 119 141
119 120 141
120 121 141
121 122 141
122 123 141
123 124 141
124 125 141
125 126 141
126 127 141
127 128 141
128 129 141
129 130 141
130 131 141
131 132 141
132 133 141
133 134 141
134 135 141
135 136 141
136 137 141
137 138 141
138 139 141
139 140 141
140 141 141
141 142 141
142 143 141
143 144 141
144 145 141
145 146 141
146 147 141
147 148 141
148 149 141
149 150 141
150 151 141
151 152 141
152 153 141
153 154 141
154 155 141
155 156 141
156 157 141
157 158 141
158 159 141
159 160 141
160 161 141
161 162 141
162 163 141
163 164 141
164 165 141
165 166 141
166 167 141
167 168 141
168 169 141
169 170 141
170 171 141
171 172 141
172 173 141
173 174 141
174 175 141
175 176 141
176 177 141
177 178 141
178 179 141
179 180 141
180 181 141
181 182 141
182 183 141
183 184 141
184 185 141
185 186 141
186 187 141
187 188 141
188 189 141
189 190 141
190 191 141
191 192 141
192 193 141
193 194 141
194 195 141
195 196 141
196 197 141
197 198 141
198 199 141
199 200 141
200 201 141
201 202 141
202 203 141
203 204 141
204 205 141
205 206 141
206 207 141
207 208 141
208 209 141
209 210 141
210 211 141
211 212 141
212 213 141
213 214 141
214 215 141
215 216 141
216 217 141
217 218 141
218 219 141
219 220 141
220 221 141
221 222 141
222 223 141
223 224 141
224 225 141
225 226 141
226 227 141
227 228 141
228 229 141
229 230 141
230 231 141
231 232 141
232 233 141
233 234 141
234 235 141
235 236 141
236 237 141
237 238 141
238 239 141
239 240 141
240 241 141
241 242 141
242 243 141
243 244 141
244 245 141
245 246 141
246 247 141
247 248 141
248 249 141
249 250 141
250 251 141
251 252 141
252 253 141
253 254 141
254 255 141
255 256 141
256 257 141
257 258 141
258 259 141
259 260 141
260 261 141
261 262 141
262 263 141
263 264 141
264 265 141
265 266 141
266 267 141
267 268 141
268 269 141
269 270 141
270 271 141
271 272 141
272 273 141
273 274 141
274 275 141
275 276 141
276 277 141
277 278 141
278 279 141
279 280 141
280 281 141
281 282 141
282 283 141
283 284 141
284 285 141
285 286 141
286 287 141
287 288 141
288 289 141
289 290 141
290 291 141
291 292 141
292 293 141
293 294 141
294 295 141
295 296 141
296 297 141
297 298 141
298 299 141
299 300 141
300 301 141
301 302 141
302 303 141
303 304 141
304 305 141
305 306 141
306 307 141
307 308 141
308 309 141
309 310 141
310 311 141
311 312 141
312 313 141
313 314 141
314 315 141
315 316 141
316 317 141
317 318 141
318 319 141
319 320 141
320 321 141
321 322 141
322 323 141
323 324 141
324 325 141
325 326 141
326 327 141
327 328 141
328 329 141
329 330 141
330 331 141
331 332 141
332 333 141
333 334 141
334 335 141
335 336 141
336 337 141
337 338 141
338 339 141
339 340 141
340 341 141
341 342 141
342 343 141
343 344 141
344 345 141
345 346 141
346 347 141
347 348 141
348 349 141
349 350 141
350 351 141
351 352 141
352 353 141
353 354 141
354 355 141
355 356 141
356 357 141
357 358 141
358 359 141
359 360 141
360 361 141
361 362 141
362 363 141
363 364 141
364 365 141
365 366 141
366 367 141
367 368 141
368 369 141
369 370 141
370 371 141
371 372 141
372 373 141
373 374 141
374 375 141
375 376 141
376 377 141
377 378 141
378 379 141
379 380 141
380 381 141
381 382 141
382 383 141
383 384 141
384 385 141
385 386 141
386 387 141
387 388 141
388 389 141
389 390 141
390 391 141
391 392 141
392 393 141
393 394 141
394 395 141
395 396 141
396 397 141
397 398 141
398 399 141
399 400 141
400 401 141
401 402 141
402 403 141
403 404 141
404 405 141
405 406 141
406 407 141
407 408 141
408 409 141
409 410 141
410 411 141
411 412 141
412 413 141
413 414 141
414 415 141
415 416 141
416 417 141
417 418 141
418 419 141
419 420 141
420 421 141
421 422 141
422 423 141
423 424 141
424 425 141
425 426 141
426 427 141
427 428 141
428 429 141
429 430 141
430 431 141
431 432 141
432 433 141
433 434 141
434 435 141
435 436 141
436 437 141
437 438 141
438 439 141
439 440 141
440 441 141
441 442 141
442 443 141
443 444 141
444 445 141
445 446 141
446 447 141
447 448 141
448 449 141
449 450 141
450 451 141
451 452 141
452 453 141
453 454 141
454 455 141
455 456 141
456 457 141
457 458 141
458 459 141
459 460 141
460 461 141
461 462 141
462 463 141
463 464 141
464 465 141
465 466 141
466 467 141
467 468 141
468 469 141
469 470 141
470 471 141
471 472 141
472 473 141
473 474 141
474 475 141
475 476 141
476 477 141
477 478 141
478 479 141
479 480 141
480 481 141
481 482 141
482 483 141
483 484 141
484 485 141
485 486 141
486 487 141
487 488 141
488 489 141
489 490 141
490 491 141
491 492 141
492 493 141
493 494 141
494 495 141
495 496 141
496 497 141
497 498 141
498 499 141
499 500 141
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125
130
135
140
145
150
155
160
165
170
175
180
185
190
195
200
205
210
215
220
225
230
235
240
245
250
255
260
265
270
275
280
285
290
295
300
305
310
315
320
325
330
335
340
345
350
355
360
365
370
375
380
385
390
395
400
405
410
415
420
425
430
435
440
445
450
455
460
465
470
475
480
485
490
495
500

  • test case 11—output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
99
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99


  • test case 12—input
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
500 499 100 70000
1 2 141
2 3 141
3 4 141
4 5 141
5 6 141
6 7 141
7 8 141
8 9 141
9 10 141
10 11 141
11 12 141
12 13 141
13 14 141
14 15 141
15 16 141
16 17 141
17 18 141
18 19 141
19 20 141
20 21 141
21 22 141
22 23 141
23 24 141
24 25 141
25 26 141
26 27 141
27 28 141
28 29 141
29 30 141
30 31 141
31 32 141
32 33 141
33 34 141
34 35 141
35 36 141
36 37 141
37 38 141
38 39 141
39 40 141
40 41 141
41 42 141
42 43 141
43 44 141
44 45 141
45 46 141
46 47 141
47 48 141
48 49 141
49 50 141
50 51 141
51 52 141
52 53 141
53 54 141
54 55 141
55 56 141
56 57 141
57 58 141
58 59 141
59 60 141
60 61 141
61 62 141
62 63 141
63 64 141
64 65 141
65 66 141
66 67 141
67 68 141
68 69 141
69 70 141
70 71 141
71 72 141
72 73 141
73 74 141
74 75 141
75 76 141
76 77 141
77 78 141
78 79 141
79 80 141
80 81 141
81 82 141
82 83 141
83 84 141
84 85 141
85 86 141
86 87 141
87 88 141
88 89 141
89 90 141
90 91 141
91 92 141
92 93 141
93 94 141
94 95 141
95 96 141
96 97 141
97 98 141
98 99 141
99 100 141
100 101 141
101 102 141
102 103 141
103 104 141
104 105 141
105 106 141
106 107 141
107 108 141
108 109 141
109 110 141
110 111 141
111 112 141
112 113 141
113 114 141
114 115 141
115 116 141
116 117 141
117 118 141
118 119 141
119 120 141
120 121 141
121 122 141
122 123 141
123 124 141
124 125 141
125 126 141
126 127 141
127 128 141
128 129 141
129 130 141
130 131 141
131 132 141
132 133 141
133 134 141
134 135 141
135 136 141
136 137 141
137 138 141
138 139 141
139 140 141
140 141 141
141 142 141
142 143 141
143 144 141
144 145 141
145 146 141
146 147 141
147 148 141
148 149 141
149 150 141
150 151 141
151 152 141
152 153 141
153 154 141
154 155 141
155 156 141
156 157 141
157 158 141
158 159 141
159 160 141
160 161 141
161 162 141
162 163 141
163 164 141
164 165 141
165 166 141
166 167 141
167 168 141
168 169 141
169 170 141
170 171 141
171 172 141
172 173 141
173 174 141
174 175 141
175 176 141
176 177 141
177 178 141
178 179 141
179 180 141
180 181 141
181 182 141
182 183 141
183 184 141
184 185 141
185 186 141
186 187 141
187 188 141
188 189 141
189 190 141
190 191 141
191 192 141
192 193 141
193 194 141
194 195 141
195 196 141
196 197 141
197 198 141
198 199 141
199 200 141
200 201 141
201 202 141
202 203 141
203 204 141
204 205 141
205 206 141
206 207 141
207 208 141
208 209 141
209 210 141
210 211 141
211 212 141
212 213 141
213 214 141
214 215 141
215 216 141
216 217 141
217 218 141
218 219 141
219 220 141
220 221 141
221 222 141
222 223 141
223 224 141
224 225 141
225 226 141
226 227 141
227 228 141
228 229 141
229 230 141
230 231 141
231 232 141
232 233 141
233 234 141
234 235 141
235 236 141
236 237 141
237 238 141
238 239 141
239 240 141
240 241 141
241 242 141
242 243 141
243 244 141
244 245 141
245 246 141
246 247 141
247 248 141
248 249 141
249 250 141
250 251 141
251 252 141
252 253 141
253 254 141
254 255 141
255 256 141
256 257 141
257 258 141
258 259 141
259 260 141
260 261 141
261 262 141
262 263 141
263 264 141
264 265 141
265 266 141
266 267 141
267 268 141
268 269 141
269 270 141
270 271 141
271 272 141
272 273 141
273 274 141
274 275 141
275 276 141
276 277 141
277 278 141
278 279 141
279 280 141
280 281 141
281 282 141
282 283 141
283 284 141
284 285 141
285 286 141
286 287 141
287 288 141
288 289 141
289 290 141
290 291 141
291 292 141
292 293 141
293 294 141
294 295 141
295 296 141
296 297 141
297 298 141
298 299 141
299 300 141
300 301 141
301 302 141
302 303 141
303 304 141
304 305 141
305 306 141
306 307 141
307 308 141
308 309 141
309 310 141
310 311 141
311 312 141
312 313 141
313 314 141
314 315 141
315 316 141
316 317 141
317 318 141
318 319 141
319 320 141
320 321 141
321 322 141
322 323 141
323 324 141
324 325 141
325 326 141
326 327 141
327 328 141
328 329 141
329 330 141
330 331 141
331 332 141
332 333 141
333 334 141
334 335 141
335 336 141
336 337 141
337 338 141
338 339 141
339 340 141
340 341 141
341 342 141
342 343 141
343 344 141
344 345 141
345 346 141
346 347 141
347 348 141
348 349 141
349 350 141
350 351 141
351 352 141
352 353 141
353 354 141
354 355 141
355 356 141
356 357 141
357 358 141
358 359 141
359 360 141
360 361 141
361 362 141
362 363 141
363 364 141
364 365 141
365 366 141
366 367 141
367 368 141
368 369 141
369 370 141
370 371 141
371 372 141
372 373 141
373 374 141
374 375 141
375 376 141
376 377 141
377 378 141
378 379 141
379 380 141
380 381 141
381 382 141
382 383 141
383 384 141
384 385 141
385 386 141
386 387 141
387 388 141
388 389 141
389 390 141
390 391 141
391 392 141
392 393 141
393 394 141
394 395 141
395 396 141
396 397 141
397 398 141
398 399 141
399 400 141
400 401 141
401 402 141
402 403 141
403 404 141
404 405 141
405 406 141
406 407 141
407 408 141
408 409 141
409 410 141
410 411 141
411 412 141
412 413 141
413 414 141
414 415 141
415 416 141
416 417 141
417 418 141
418 419 141
419 420 141
420 421 141
421 422 141
422 423 141
423 424 141
424 425 141
425 426 141
426 427 141
427 428 141
428 429 141
429 430 141
430 431 141
431 432 141
432 433 141
433 434 141
434 435 141
435 436 141
436 437 141
437 438 141
438 439 141
439 440 141
440 441 141
441 442 141
442 443 141
443 444 141
444 445 141
445 446 141
446 447 141
447 448 141
448 449 141
449 450 141
450 451 141
451 452 141
452 453 141
453 454 141
454 455 141
455 456 141
456 457 141
457 458 141
458 459 141
459 460 141
460 461 141
461 462 141
462 463 141
463 464 141
464 465 141
465 466 141
466 467 141
467 468 141
468 469 141
469 470 141
470 471 141
471 472 141
472 473 141
473 474 141
474 475 141
475 476 141
476 477 141
477 478 141
478 479 141
479 480 141
480 481 141
481 482 141
482 483 141
483 484 141
484 485 141
485 486 141
486 487 141
487 488 141
488 489 141
489 490 141
490 491 141
491 492 141
492 493 141
493 494 141
494 495 141
495 496 141
496 497 141
497 498 141
498 499 141
499 500 141
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125
130
135
140
145
150
155
160
165
170
175
180
185
190
195
200
205
210
215
220
225
230
235
240
245
250
255
260
265
270
275
280
285
290
295
300
305
310
315
320
325
330
335
340
345
350
355
360
365
370
375
380
385
390
395
400
405
410
415
420
425
430
435
440
445
450
455
460
465
470
475
480
485
490
495
500

  • test case 12—output
1
2
1
100

优先级队列+邻接矩阵+Dijkstra算法

发表于 2018-12-11 | Edited on 2023-03-05 | 分类于 算法设计与分析

优先级队列+邻接矩阵+Dijkstra算法

DijkStra算法代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 定义Edge表示每一条边,from是始点,to是汇点,distance表示距离
struct Edge {
int from, to, distance;
Edge(int f, int t, int d) :from(f), to(t), distance(d) {};
bool operator <(const Edge& e)const { return this->distance > e.distance; };
};

// graph 表示图,以邻接矩阵形式表示,其中0编号顶点不算在图中。
// source表示源点
// distance表示从source到其他顶点的距离数组
// visit[i]表示顶点i是否在源点所在的集合中
void dijkstra(const vector<vector<int>>& graph, const int source, vector<int>& distance) {
vector<int> visit(graph.size(), 0);
priority_queue<Edge> myQueue;
visit[0] = 1;
visit[source] = 1;
// 初始时往优先级队列中加入从源点发出的所有的边
for (int i = 1; i < graph.size(); ++i)
if(visit[i]==0)
myQueue.emplace(source, i, distance[i]);

while (!myQueue.empty()) {
Edge e = myQueue.top();
myQueue.pop();
if (visit[e.to] == 1)
continue;
visit[e.to] = 1;
distance[e.to] = e.distance;
for (int j = 1; j < graph.size(); ++j) {
if (visit[j] == 0 && distance[e.to] + graph[e.to][j] < distance[j]){
myQueue.emplace(e.to, j, distance[e.to] + graph[e.to][j]);
}
}
}
}

复杂度分析

最多每条边都进入优先级队列,每次进入后队列调整用时logm,所以复杂度为O(mlogn)

康奈尔大学IC3研究院介绍

发表于 2018-12-04 | Edited on 2023-03-05 | 分类于 区块链技术研究

IC3研究院简介

康奈尔大学IC3研究院致力于促进区块链技术的研究和应用(Advancing the Science and Applications of Blockchains).由康奈尔大学(Cornell University)、Cornell Tech、加州大学伯克利分校(UC Berkeley)、伊利诺伊大学(University of Illinois)厄巴纳校区和香槟校区以及以色列理工学院(Technion)的联合组成。

IC3研究院的主要目的:

  • Blockchain Science:将区块链科学部署到区块链科技应用的第一线中。由于当前的数字货币和合约依赖于启发式设计,至今都没有一个能够保证合约和数字货币足够安全属性的设计标准,建立一套高效的,可面向大规模、高安全性的区块链解决方案是IC3亟待解决的问题。
  • Blockchain Code:在坚实的科学基础的支持下,提供代码中的区块链创新。IC3合作开发并验证众多开源区块链工具和解决方案以满足金融行业在成本、安全、隐私和性能方面的需求。其区块链试验台Miniature World可以大规模模拟真实世界场景; 例如比特币运营系统规模的15%的实验,比较了比特币和Bitcoin-NG,一种由IC3开创的新型高性能区块链协议。

IC3研究院的研究目标

IC3研究院的研究项目涉及到了6大挑战:

  • 区块链扩展能力和性能:扩展区块链以使得公链和联盟连可以处理密集的全局工作,以及支持每秒可以处理100,000事务的能力。
  • 设计和构建的正确性:通过编程语言方面的技术构建正确的代码和具有安全性证明的加密协议使得区块链开发人员能够设计安全的协议、编写正确的代码。
  • 保密性:利用加密技术和可信的硬件,将透明性和安全性在区块链中结合起来。
  • 提供可信数据:为区块链提供可靠的、鲁邦的数据供给系统,贡献高可信的数据提供方案。
  • 安全和合规性:通过评估传统合同法和智能合约中的犯罪风险,为区块链的有效监测和有针对性干预提供技术和协议。
  • 系统兼容:为区块链部署制定实用的迁移方式,实现新区块链系统与遗留系统的集成。

IC3的研究项目

  • Hydra:Hydra是一个先进的以太坊合同开发框架,用于去中心化安全和bug赏金,该框架通过严格的加密经济安全保证减轻程序员和编译器错误。

  • Solidus:Solidus是可供 银行、政府、审计等使用的联盟连,它拥有区块链的去中心化特点的同时,但是相较现有的比特币系统,具有更高性能、提供更有力的监管和控制,许多成功的点对点技术历来被集中式或商用系统取代。Solidus解决了许多金融机构的期望——即数字货币和合约遵循相同的流程。

  • Bitcoin-NG:由IC3牵头制定的一个行的区块链协议,致力于解决比特币的可扩展性问题,使得比特币网络能够在有限的网络环境下达到最高的吞吐量。不仅能够提高吞吐量,还能减少交易延迟,甚至可以达到秒级的交易确认速度。同时Bitcoin-NG不改变比特币开放性的架构和信任模式。

  • Miniature World:一个可模拟真实世界区块链的区块链实验平台。由大约1000个节点组成。 该测试平台使我们能够在不同的区块链和各种用例上运行实验,使用现实的互联网延迟来评估真实场景(如上面针对比特币NG所引用的)。 目的是为行业赞助商提供微型世界,以评估各种区块链及其使用案例。看起来并不免费。

  • Fruitchain:一种新的激励兼容区块链的方法。今天的大部分区块链,比如比特币,都不是“激励兼容”,这意味着他们很容易受到不诚实对手的战略游戏的影响。 IC3已经证明,比特币区块链可以被矿工或采矿池所破坏,其采集散列功率远低于50%。 Fruitchain是一种创新的区块链方法,它可以阻止不诚实的游戏,使其对于具有低于50%的散列能力的对手来说极其无利可图,实现了ε-均衡或近纳什均衡。(在机制设计理论中,一个程序称为是激励相容的,若所有的参与者若依机制在诚实地揭示任何被要求的私有资讯时,会得到最好的成果。)

  • Falcon Network:用于区块链的高性能广域互连网,Falcon Network通过最少的验证和直通路由实现了超越当前方法的收益。 客户端不需要特殊软件,它基本上比所有其他已知技术更快。

  • FLAC:实际应用程序通常根据动态计算做出授权决策。 如果攻击者可能不正确地影响授权计算,则系统的完整性可能会受到影响。 由于授权决策通常基于敏感数据(如成员列表和密码),因此授权也可能会影响机密性。 Flow-Limited Authorization Calculus(FLAC)既是用于推理动态授权的简单,富有表现力的模型,也是用于安全地实现各种授权机制的语言。 即使对于包含并实现丰富的动态授权机制的程序,FLAC也提供了强大的端到端信息安全保障。

  • 去中心化理论与研究:这项工作探索了开放去中心化系统的安全性和稳定性的理论基础。 去中心化的好处包括抵抗多种攻击,多样性和权力分散。 比特币的新颖性和鼓舞人心的成功提供了新的证据,证明安全的去中心化系统比以前想象的更可行。 IC3和合作者刚刚发布了一份研究论文,分析了数字自治组织(DAO)及其投票机制。 本文确定了DAO机制设计中存在的问题,即激励投资者采取战略行为;这与他们的偏好真实投票不一致。
    –Hawk:隐私保护区块链和智能合约。现有的基于区块链的加密货币(如比特币和以太坊)将所有金融交易存储在区块链中。 这牺牲了金融交易的隐私,这在许多应用程序中都是必不可少的。 Hawk是一种基于区块链的智能合约系统,它在区块链上存储加密交易,并依靠加密技术来保留加密货币的安全性。

  • Town Crier:智能合约的认证数据源。为了推理现实世界,加密货币系统中的智能合约将依赖于我们称之为认证数据馈送(ADF)的信息输入; 此类信息可包括股票价格,气象报告,新闻和其他当前事件。 因此,在提供安全性以防止试图影响合同结果的攻击者操纵的意义上,重要的是ADF是值得信赖的。 通过利用可信硬件为客户合同提供可靠,数字签名的数据证明,Town Crier系统可以在对其运营商的最小信任假设下充当值得信赖的ADF。

  • 虚拟公证:免费安全的电子证明服务。虚拟公证是一种证明网上事实的服务。虚拟公证人在比特币块链上发行独立证书和不可变记录。它已运行超过3年,并认证超过600000个事实。

  • EtherScrape:以太坊中的智能合约是用高级编程语言(通常是Serpent或Solidity)编写的,然后编译成以太网虚拟机的字节码。 此编译步骤删除了高级源代码中的许多有用信息,例如注释,变量名称等。如果您可以识别合同的高级源代码,则更有可能搞清楚 它能做什么。 EtherScrape使用指纹识别将区块链上的每个智能合约(即编译的字节码)与创建它的高级源代码相匹配。

  • Gyges:去中心化智能合约中的犯罪。“比特币2.0”最广泛期望的两个目标是隐私和更具表现力的智能合约。数字货币的许多用途对隐私有着明确和合法的需求(例如,金融服务公司被期望保护其客户交易的隐私)。通用的智能合约编程框架使得修补、打造原型和搜索下一个“杀手级应用程序”数字货币变得容易。这两个方向似乎相互矛盾;然而,通过使用复杂的加密技术(如零知识证明和多方计算),我们探索如何同时实现这两个目标。

  • HoneyBadgerBFT:HoneyBadgerBFT是第一个实用的异步BFT协议,它可以在不做任何时序假设的情况下保证实时性。 我们的解决方案基于一种新颖的原子广播协议,可实现最佳的渐近效率。 我们提出了一个实现和实验结果,以表明我们的系统可以实现每秒数万个事务的吞吐量,并可扩展到广域网上的一百多个节点。 我们甚至在Tor上进行BFT实验,无需调整任何参数。 与其他选择不同,HoneyBadgerBFT根本不关心底层网络。

  • Teechan:Teechan是一种新的可伸缩性解决方案,IC3最初是为比特币开发的,但是对于允许的块链也有广泛的应用。Teechan使用可信执行环境(TEE)来保护用户凭据。它是一种新的、实用的、高吞吐量的、低延迟的离链事务协议,可以安全地部署在比特币网络上,就像现在存在的那样。

带通配符的字符串匹配

发表于 2018-12-02 | Edited on 2023-03-05 | 分类于 算法设计与分析

题目来源: http://noi.openjudge.cn/ch0206/6252/

题目描述

通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符。通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符。

你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配。

例如,1?456 可以匹配 12456、13456、1a456,但是却不能够匹配23456、1aa456;
2*77?8可以匹配 24457798、237708、27798。

解题思路

使用动态规划,即可,但是’*‘可以代表空字符串,一个字符串和多个字符串,所以遇到’*'的时候需要额外的处理。
假设F[i][j]表示长度为i第一个字符串X和长度为j的第二个字符串Y进行匹配,长度为i对应的字符是X[i-1](字符串下标从0开始计算),长度为j对应于Y的字符Y[j-1]。

  • 如果X[i-1]是’?‘,那么F[i][j] = F[i-1][j-1], 因为’?'可以匹配任意单个字符。
  • 如果X[i-1]是‘*’,由于’*'可以表示任意多个字符,所以此时对应关系为:
    • F[i][j] = F[i-1][j] || F[i-1][j-1]||F[i][j-1] ;三个关系式分别对应’*'表示0、1、多个字符。
  • 如果X[i-1]是普通字符,F[i][j] = X[i-1] == Y[j-1];

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<string>
#include<vector>
#include<iostream>
#include<cstdio>
using namespace std;

string match(const string& str1, const string& str2) {

vector<vector<bool>> F(str1.size() + 1, vector<bool>(str2.size() + 1, false));
// 这里用于初始化,F[0][0] = true;F[i][0]是否为true需要看X[i-1]是否为'\*'
F[0][0] = true;
for (int i = 1; i <= str1.size(); ++i) {
if (str1[i - 1] == '*')
F[i][0] = F[i - 1][0];
}

// F[i][j]表示长度为i的str1和长度为j的str2是否匹配
for (int i = 1; i <= str1.size(); ++i) {
for (int j = 1; j <= str2.size(); ++j) {
if (str1[i - 1] == '?' || str1[i - 1] == str2[j - 1])
F[i][j] = F[i - 1][j - 1];
else if (str1[i - 1] == '*') {
F[i][j] = F[i - 1][j] || F[i][j - 1] || F[i - 1][j - 1];
}
else {
F[i][j] = false;
}
}
}
if (F[str1.size()][str2.size()])
return "matched";
else
return "not matched";
}

int main() {
// 加了下面两句速度反而变慢了? shit
ios::sync_with_stdio(false);
std::cin.tie(0);
string str1, str2;
getline(cin, str1);
getline(cin, str2);
cout << match(str1, str2) << endl;
}

<1…345>
博主

博主

© 2023 博主
由 Hexo 强力驱动 v6.3.0
|
主题 – NexT.Pisces v6.6.0
本站总访问量 次 | 本站访问人次