并查集
class UnionFind{
public:
UnionFind(int n){
count=n;
parent.resize(n);
member.resize(n);
for(int i=0;i<n;++i){
parent[i]=i;
member[i]=1;
}
}
void union(int i, int j){
int parentI=find(i);
int parentJ=find(j);
if(parentI==parentJ) return ;
if(size[parentI]>size[parentJ]){
parent[parentJ]=parentI;
member[parentI]+=member[parentJ];
}else{
parent[parentI]=parentJ;
member[parentJ]+=member[parentI];
}
count--;
}
bool isConnected(int i, int j){
int parentI=find(i);
int parentJ=find(j);
return parentI==parentJ;
}
int count(){
return count;
}
private:
int find(int i){
while(parent[i]!=i){
parent[i]=parent[parent[i]];
i=parent[i];
}
return i;
}
private:
int count;
vector<int> parent;
vector<int> member;
};
TrieTree
//前缀树(字典树)增删改查的实现
//程序设计题目,如设计LRU缓存
class TrieTree {
private:
struct TrieNode;
public:
TrieTree() {
root = new TrieNode();
}
public:
bool search(string& s) {
if (s.empty() || s.length() == 0) return false;
TrieNode* node = root;
for (auto c : s) {
int index = c - 'a';
if ((node = node->map[index]) == nullptr)
return false;
}
return node->end != 0;
}
void insert(string& s) {
if (s.empty() || s.length() == 0) return;
TrieNode** node = &root;
for (auto c : s) {
int index = c - 'a';
node=&((*node)->map[index]);
if ((*node) == nullptr) {
(*node) = new TrieNode();
}
(*node)->path++;
}
(*node)->end++;
}
void delStr(string& s) {
if (s.empty() || s.length() == 0) return;
TrieNode* node = root;
if (search(s)) {
for (auto c : s) {
int index = c - 'a';
node = node->map[index];
if (node->path-- == 1) {
delete node;
node = nullptr;
return;
}
}
node->end--;
}
}
int preQuery(string& s) { //返回以s为前缀的串有几个
if (s.empty() || s.length() == 0) return 0;
TrieNode* node = root;
for (auto c : s) {
int index = c - 'a';
if ((node = node->map[index]) == nullptr)
return 0;
}
return node->path;
}
private:
TrieNode* root;
private:
struct TrieNode {
int path;
int end;
vector<TrieNode*> map;
TrieNode() :path(0), end(0) {
map.reserve(26);
for (auto itr : map)
itr = nullptr;
}
};
};
DJ
#include<iostream>
#include<algorithm>
#include<queue>
#include<memory.h>
using namespace std;
struct edge{
int to;
int next;
int w;
}edge[500010];
int cnt=0;
int head[100010];
int d[100010];
int vis[100010];
int n,m,u,v,w,s;
priority_queue<pair<int,int> >q;
inline void Add(int u,int v,int w){
cnt++;
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
inline void DJ(int s){
memset(d,0x3f,sizeof(d));
d[s]=0;
q.push(make_pair(0,s));
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(vis[x])
continue;
vis[x]=1;
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
int z=edge[i].w;
if(d[y]>d[x]+z)
{
d[y]=d[x]+z;
if(!vis[y])
{
q.push(make_pair(-d[y],y));
}
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
Add(u,v,w);
}
DJ(s);//s为起点
for(int i=1;i<=n;i++){
cout<<d[i]<<" ";
}
}
质数欧拉筛
#include <algorithm>//std::remove_if
#include <numeric>//std::iota
std::vector<int> eratosthenes(int max){
std::vector<int> vi(max+1);//0, 1, 2, ..., max
std::iota(vi.begin(), vi.end(), 0);
if(max>=2){
int prime=2;
while(prime*prime<=max){//2 to sqrt(max)
for(size_t index=prime*2; index<vi.size(); index+=prime){
vi[index]=0;//Rule out this number.
}
for(prime++; prime*prime<=max; prime++){
if(vi[prime]>0){
break;//Jump to next non-zero.which is prime
}
}
}
}
vi.erase(std::remove_if(vi.begin(), vi.end(), [](int i)->bool{
return i<=1;
}), vi.end());//Remove all zeros and the one.
return vi;
}