题意: 思路: 题意的可塑造性很强,我们可以让最小生成树就是最短路,呢么我们现在就是给最小生成树找一个素数,很明显最小生成树的素数范围在 坑点: 没有注意边权w最大是1e9,我给非最小生成树上的边赋值为无穷了,一直wa 参考代码:
给n个点,m条边,让构建一个有向无环无重边的图,并且图的最短路是素数,最小生成树也是素数。
[1,1e14],所以预处理1-1e14不太可能,所以我们只需要找距离不小于n-1最近的素数即可,然后让最小生成树上的一条边和最小生成树上的其余为1的边组成这个素数即可#include <cstdio> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <queue> #include <cstring> #include <string> #include <cstdlib> #include <cmath> using namespace std; const int inf = 1 << 30; const int maxn = 1e5 + 5; typedef long long ll; //const int N = 5005; int ans[maxn]; bool vis[maxn], cnt; vector<int> vec; void isprime() { vis[1] = true; int N = maxn - 1; for (int i = 2; i <= N; i++) { if (!vis[i]) { for (int j = i + i; j <= N; j += i) { vis[j] = true; } } } for (int i = 2; i <= N; i++) { if (!vis[i]) vec.push_back(i); } } int main() { ios::sync_with_stdio(false); cin.tie(0); isprime(); int n, m,cnt=0; cin >> n >> m; int pos = lower_bound(vec.begin(), vec.end(), n-1) - vec.begin(); pos = vec[pos]; cout << pos << ' ' << pos << endl; cout << 1 << ' ' << 2 <<' '<<pos - n+2<< endl; for (int i = 2; i <n; i++) { cout << i << ' ' << i + 1 <<' '<<1 << endl; } m=m-n+1; for(int i=1;i<=n;i++) for(int j=i+2;j<=n;j++) { if(cnt==m) break; cnt++; cout<<i<<' '<<j<<' '<<1000000000<<endl; } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算