Codeforces Round #457 (Div. 2) C. Jamie and Interesting Graph(构造)

2023-10-05 23:30

本文主要是介绍Codeforces Round #457 (Div. 2) C. Jamie and Interesting Graph(构造),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

Jamie has recently found undirected weighted graphs with the following
properties very interesting:

The graph is connected and contains exactly n vertices and m edges.
All edge weights are integers and are in range [1, 109] inclusive. The
length of shortest path from 1 to n is a prime number. The sum of
edges’ weights in the minimum spanning tree (MST) of the graph is a
prime number. The graph contains no loops or multi-edges. If you are
not familiar with some terms from the statement you can find
definitions of them in notes section.

Help Jamie construct any graph with given number of vertices and edges
that is interesting!

Input

First line of input contains 2 integers n, m — the required number of
vertices and edges.

Output

In the first line output 2 integers sp, mstw (1 ≤ sp, mstw ≤ 1014) —
the length of the shortest path and the sum of edges’ weights in the
minimum spanning tree.

In the next m lines output the edges of the graph. In each line output
3 integers u, v, w (1 ≤ u, v ≤ n, 1 ≤ w ≤ 109) describing the edge
connecting u and v and having weight w.

input

4 4

output

7 7
1 2 3
2 3 2
3 4 2
2 4 4

input

5 4

output

7 13
1 2 2
1 3 4
1 4 3
4 5 4

Note

The graph of sample 1: Shortest path sequence: {1, 2, 3, 4}. MST edges
are marked with an asterisk (*).

Definition of terms used in the problem statement:

A shortest path in an undirected graph is a sequence of vertices
(v1, v2, … , vk) such that vi is adjacent to vi + 1 1 ≤ i < k and
the sum of weight is minimized where w(i, j) is the edge weight
between i and j. (https://en.wikipedia.org/wiki/Shortest_path_problem)

A prime number is a natural number greater than 1 that has no positive
divisors other than 1 and itself.
(https://en.wikipedia.org/wiki/Prime_number)

A minimum spanning tree (MST) is a subset of the edges of a connected,
edge-weighted undirected graph that connects all the vertices
together, without any cycles and with the minimum possible total edge
weight. (https://en.wikipedia.org/wiki/Minimum_spanning_tree)

https://en.wikipedia.org/wiki/Multiple_edges

思路

要求构造一个图,它的最短路的权值和最小生成树的权值和一样,不能有重边

我们只需要把他处理成一条链,连上n-2条边权为1的边,然后剩下的边用一个权值非常大的值连起来。

代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
const int N=3e5+9;
int prime[N];
bool is_prime[N];
int tot=0;
void get_prime()
{mem(is_prime,true);is_prime[0]=is_prime[1]=false;for(int i=2; i<N; i++){if(is_prime[i]){prime[tot++]=i;for(int j=2*i; j<=N; j+=i)is_prime[j]=false;}}
}
int main()
{get_prime();int n,m;scanf("%d%d",&n,&m);int num=prime[lower_bound(prime,prime+tot,n-1)-prime];int cha=num-n+1;int t=m-n+1;printf("%d %d\n",num,num);for(int i=1; i<=n-1; i++){if(i==1)printf("%d %d %d\n",i,i+1,cha+1);elseprintf("%d %d %d\n",i,i+1,1);}for(int i=1; i<=n-1; i++){for(int j=i+2; j<=n; j++){if(t==0) return 0;t--;printf("%d %d %d\n",i,j,10000000);}}return 0;
}

这篇关于Codeforces Round #457 (Div. 2) C. Jamie and Interesting Graph(构造)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152282

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的 构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。 简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是 要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时, 如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;