并查集

  1. class UnionFind{
  2. public:
  3. UnionFind(int n){
  4. count=n;
  5. parent.resize(n);
  6. member.resize(n);
  7. for(int i=0;i<n;++i){
  8. parent[i]=i;
  9. member[i]=1;
  10. }
  11. }
  12. void union(int i, int j){
  13. int parentI=find(i);
  14. int parentJ=find(j);
  15. if(parentI==parentJ) return ;
  16. if(size[parentI]>size[parentJ]){
  17. parent[parentJ]=parentI;
  18. member[parentI]+=member[parentJ];
  19. }else{
  20. parent[parentI]=parentJ;
  21. member[parentJ]+=member[parentI];
  22. }
  23. count--;
  24. }
  25. bool isConnected(int i, int j){
  26. int parentI=find(i);
  27. int parentJ=find(j);
  28. return parentI==parentJ;
  29. }
  30. int count(){
  31. return count;
  32. }
  33. private:
  34. int find(int i){
  35. while(parent[i]!=i){
  36. parent[i]=parent[parent[i]];
  37. i=parent[i];
  38. }
  39. return i;
  40. }
  41. private:
  42. int count;
  43. vector<int> parent;
  44. vector<int> member;
  45. };

TrieTree

  1. //前缀树(字典树)增删改查的实现
  2. //程序设计题目,如设计LRU缓存
  3. class TrieTree {
  4. private:
  5. struct TrieNode;
  6. public:
  7. TrieTree() {
  8. root = new TrieNode();
  9. }
  10. public:
  11. bool search(string& s) {
  12. if (s.empty() || s.length() == 0) return false;
  13. TrieNode* node = root;
  14. for (auto c : s) {
  15. int index = c - 'a';
  16. if ((node = node->map[index]) == nullptr)
  17. return false;
  18. }
  19. return node->end != 0;
  20. }
  21. void insert(string& s) {
  22. if (s.empty() || s.length() == 0) return;
  23. TrieNode** node = &root;
  24. for (auto c : s) {
  25. int index = c - 'a';
  26. node=&((*node)->map[index]);
  27. if ((*node) == nullptr) {
  28. (*node) = new TrieNode();
  29. }
  30. (*node)->path++;
  31. }
  32. (*node)->end++;
  33. }
  34. void delStr(string& s) {
  35. if (s.empty() || s.length() == 0) return;
  36. TrieNode* node = root;
  37. if (search(s)) {
  38. for (auto c : s) {
  39. int index = c - 'a';
  40. node = node->map[index];
  41. if (node->path-- == 1) {
  42. delete node;
  43. node = nullptr;
  44. return;
  45. }
  46. }
  47. node->end--;
  48. }
  49. }
  50. int preQuery(string& s) { //返回以s为前缀的串有几个
  51. if (s.empty() || s.length() == 0) return 0;
  52. TrieNode* node = root;
  53. for (auto c : s) {
  54. int index = c - 'a';
  55. if ((node = node->map[index]) == nullptr)
  56. return 0;
  57. }
  58. return node->path;
  59. }
  60. private:
  61. TrieNode* root;
  62. private:
  63. struct TrieNode {
  64. int path;
  65. int end;
  66. vector<TrieNode*> map;
  67. TrieNode() :path(0), end(0) {
  68. map.reserve(26);
  69. for (auto itr : map)
  70. itr = nullptr;
  71. }
  72. };
  73. };

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;
}