• 模板整理(三)


    18.迪杰斯特拉(Dijkstra)算法

    // 邻接矩阵
    typedef struct _graph
    {
        char vexs[MAX];       // 顶点集合
        int vexnum;           // 顶点数
        int edgnum;           // 边数
        int matrix[MAX][MAX]; // 邻接矩阵
    }Graph, *PGraph;
     
    // 边的结构体
    typedef struct _EdgeData
    {
        char start; // 边的起点
        char end;   // 边的终点
        int weight; // 边的权重
    }EData;
     
     
     
    /*
     * Dijkstra最短路径。
     * 即,统计图(G)中"顶点vs"到其它各个顶点的最短路径。
     *
     * 参数说明:
     *        G -- 图
     *       vs -- 起始顶点(start vertex)。即计算"顶点vs"到其它顶点的最短路径。
     *     prev -- 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。
     *     dist -- 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。
     */
    void dijkstra(Graph G, int vs, int prev[], int dist[])
    {
        int i,j,k;
        int min;
        int tmp;
        int flag[MAX];      // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。
     
        // 初始化
        for (i = 0; i < G.vexnum; i++)
        {
            flag[i] = 0;              // 顶点i的最短路径还没获取到。
            prev[i] = 0;              // 顶点i的前驱顶点为0。
            dist[i] = G.matrix[vs][i];// 顶点i的最短路径为"顶点vs"到"顶点i"的权。
        }
     
        // 对"顶点vs"自身进行初始化
        flag[vs] = 1;
        dist[vs] = 0;
     
        // 遍历G.vexnum-1次;每次找出一个顶点的最短路径。
        for (i = 1; i < G.vexnum; i++)
        {
            // 寻找当前最小的路径;
            // 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。
            min = INF;
            for (j = 0; j < G.vexnum; j++)
            {
                if (flag[j]==0 && dist[j]<min)
                {
                    min = dist[j];
                    k = j;
                }
            }
            // 标记"顶点k"为已经获取到最短路径
            flag[k] = 1;
     
            // 修正当前最短路径和前驱顶点
            // 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。
            for (j = 0; j < G.vexnum; j++)
            {
                tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出
                if (flag[j] == 0 && (tmp  < dist[j]) )
                {
                    dist[j] = tmp;
                    prev[j] = k;
                }
            }
        }
     
        // 打印dijkstra最短路径的结果
        printf("dijkstra(%c): 
    ", G.vexs[vs]);
        for (i = 0; i < G.vexnum; i++)
            printf("  shortest(%c, %c)=%d
    ", G.vexs[vs], G.vexs[i], dist[i]);
    }
    View Code

     19.优先队列

    priority_queue<int> qi;
    
    priority_queue<int, vector<int>, greater<int> >qi2;
    
    struct node
    {
        friend bool operator< (node n1, node n2)
        {
            return n1.priority < n2.priority;
        }
        int priority;
        int value;
    };
    
    #include<iostream>
    #include<functional>
    #include<queue>
    using namespace std;
    struct node
    {
        friend bool operator< (node n1, node n2)
        {
            return n1.priority < n2.priority;
        }
        int priority;
        int value;
    };
    int main()
    {
        const int len = 5;
        int i;
        int a[len] = {3,5,9,6,2};
        //示例1
        priority_queue<int> qi;
        for(i = 0; i < len; i++)
            qi.push(a[i]);
        for(i = 0; i < len; i++)
        {
            cout<<qi.top()<<" ";
            qi.pop();
        }
        cout<<endl;
        //示例2
        priority_queue<int, vector<int>, greater<int> >qi2;
        for(i = 0; i < len; i++)
            qi2.push(a[i]);
        for(i = 0; i < len; i++)
        {
            cout<<qi2.top()<<" ";
            qi2.pop();
        }
        cout<<endl;
        //示例3
        priority_queue<node> qn;
        node b[len];
        b[0].priority = 6; b[0].value = 1; 
        b[1].priority = 9; b[1].value = 5; 
        b[2].priority = 2; b[2].value = 3; 
        b[3].priority = 8; b[3].value = 2; 
        b[4].priority = 1; b[4].value = 4; 
    
        for(i = 0; i < len; i++)
            qn.push(b[i]);
        cout<<"优先级"<<'	'<<""<<endl;
        for(i = 0; i < len; i++)
        {
            cout<<qn.top().priority<<'	'<<qn.top().value<<endl;
            qn.pop();
        }
        return 0;
    }
    View Code

    20.大数同余定理

    #include<stdio.h>//大数求余,其中n(除数)不是大数 
    char a[1000];
    int main()
     int i,j,k,m,n;
    {
     while(scanf("%s%d",a,&n)!=EOF)
     {
      m=0;
      for(i=0;a[i]!='';i++)
       m=((m*10)%n+(a[i]-'0')%n)%n;
      printf("%d
    ",m);
     }
     return 0;
    }
    View Code
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    iis应用程序池定时自动回收
    js获取1100之间的随机整数
    一个简单的方法实现ASP.NET网站实现http访问强制转https(不需要URL Rewrite)
    js 生成的html class属性失效问题
    此网站无法提供安全连接(客户端和服务器不支持一般 SSL 协议版本或加密套件。)TLS 1.1/TLS 1.2配置
    nextcloud & aria2 搭建 芒果
    AndroidStudio开发Flutter使用技巧
    Jenkins配置gitlab合并分支后自动构建
    Python 中 import module 和 package 方法简单记录
    https域名证书cer转pem格式
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7506183.html
Copyright © 2020-2023  润新知