zoukankan      html  css  js  c++  java
  • 图论算法

    Prim算法

     1 #include<iostream>
     2 using namespace std;
     3 
     4 const int max = 100;
     5 int Graph[max][max];
     6 
     7 void Prim(int v, int n)
     8 {
     9     int closet[max]; //存放顶点
    10     int lowcost[max]; //存放权值
    11     int i, j;
    12     for (i = 0; i < n; ++i)
    13     {
    14         lowcost[i] = Graph[v][i];
    15         closet[i] = v;
    16     }
    17     int k;
    18     for (i = 1; i < n; ++i)
    19     {
    20         int min = INT_MAX;
    21         for(j = 0; j < n; ++j)
    22             if (lowcost[j] != 0 && lowcost[j] < min)
    23             {
    24                 min = lowcost[j];
    25                 k = j;
    26             }
    27         printf(" 边(%d, %d)权为: %d
    ", closet[k], k, min);
    28         lowcost[k] = 0;
    29         for (j = 0; j < n; ++j)
    30             if (Graph[k][j] != 0 && Graph[k][j] < lowcost[j])
    31             {
    32                 lowcost[j] = Graph[k][j];
    33                 closet[j] = k;
    34             }
    35     }
    36 }
    37 
    38 int main()
    39 {
    40     int numV, numE; //numV:边数; numE:顶点
    41     cin >> numV >> numE;
    42     for (int i = 0; i < numE; ++i)
    43         for (int j = 0; j < numE; ++j)
    44             Graph[i][j] = INT_MAX;
    45     for (int i = 0; i < numE; ++i)
    46         Graph[i][i] = 0;
    47 
    48     int a, b, c;
    49     for (int i = 0; i < numV; ++i)
    50     {
    51         cin >> a >> b >> c;
    52         Graph[a][b] = c;
    53         Graph[b][a] = c;
    54     }
    55     int v; //V出发顶点
    56     cin >> v;
    57     Prim(v, numE);    
    58 }

    输出结果:

    Dijkstra算法

      1 #include <iostream>
      2 using namespace std;
      3 
      4 int  matrix[100][100]; // 邻接矩阵
      5 int  S[100];     // 标记数组
      6 int  dist[100];        // 源点到顶点i的最短距离
      7 int  path[100];        // 记录最短路的路径
      8 int  vertex_num;       // 顶点数
      9 int  edge_num;         // 边数
     10 
     11 void Dispath(int v)
     12 {
     13     int apath[100];
     14     int i, j, d, k;
     15     for (i = 0; i < vertex_num; ++i)
     16         if (S[i] == 1 && i != v)
     17         {
     18             cout << v << "---" << i << "路径长度为:" << dist[i] << "  路径为:";
     19             d = 0;
     20             apath[d] = i;
     21             k = path[i];
     22             if (k == -1)
     23                 cout << "无路径" << endl;
     24             else
     25             {
     26                 while (k != v)
     27                 {
     28                     ++d;
     29                     apath[d] = k;
     30                     k = path[k];
     31                 }
     32                 ++d;
     33                 apath[d] = v;
     34                 cout << apath[d];
     35                 for (j = d - 1; j >= 0; --j)
     36                     cout << ", " << apath[j];
     37                 cout << endl;
     38             }
     39         }
     40 }
     41 
     42 void Dijkstra(int v)
     43 {
     44     int i, j, Mindis, u;
     45     for (i = 0; i < vertex_num; ++i)
     46     {
     47         dist[i] = matrix[v][i];
     48         S[i] = 0;
     49         if (matrix[v][i] < INT_MAX)
     50             path[i] = v;
     51         else
     52             path[i] = -1;
     53     }
     54     S[v] = 1;
     55     for (i = 0; i < vertex_num - 1; ++i)
     56     {
     57         Mindis = INT_MAX;
     58         for (j = 0; j < vertex_num; ++j)
     59             if (S[j] == 0 && dist[j] < Mindis)
     60             {
     61                 u = j;
     62                 Mindis = dist[j];
     63             }
     64         S[u] = 1;
     65         for (j = 0; j < vertex_num; ++j)
     66             if (S[j] == 0)
     67                 if (matrix[u][j] < INT_MAX && dist[u] + matrix[u][j] < dist[j])
     68                 {
     69                     dist[j] = dist[u] + matrix[u][j];
     70                     path[j] = u;
     71                 }
     72     }
     73     Dispath(v);
     74 }
     75 
     76 int main()
     77 {
     78     cout << "请输入图的顶点数(<100):";
     79     cin >> vertex_num;
     80     cout << "请输入图的边数:";
     81     cin >> edge_num;
     82 
     83     for (int i = 0; i < vertex_num; i++)
     84         for (int j = 0; j < vertex_num; j++)
     85             matrix[i][j] = (i != j) ? INT_MAX : 0;  // 初始化 matrix 数组
     86     cout << "请输入边的信息:
    ";
     87     int u, v, w;
     88     for (int i = 0; i < edge_num; i++)
     89     {
     90         cin >> u >> v >> w;
     91         matrix[u][v] = w;
     92     }
     93 
     94     cout << "请输入源点(<" << vertex_num << "):";
     95     int source;  //源点
     96     cin >> source;
     97     Dijkstra(source);
     98     system("pause");
     99     return 0;
    100 }
    View Code
    #include <iostream>
    using namespace std;
    
    int  matrix[100][100]; // 邻接矩阵
    int  S[100];     // 标记数组
    int  dist[100];        // 源点到顶点i的最短距离
    int  path[100];        // 记录最短路的路径
    int  vertex_num;       // 顶点数
    int  edge_num;         // 边数
    
    void Dispath(int v)
    {
        int apath[100];
        int i, j, d, k;
        for (i = 0; i < vertex_num; ++i)
            if (S[i] == 1 && i != v)
            {
                cout << v << "---" << i << "路径长度为:" << dist[i] << "  路径为:";
                d = 0;
                apath[d] = i;
                k = path[i];
                if (k == -1)
                    cout << "无路径" << endl;
                else
                {
                    while (k != v)
                    {
                        ++d;
                        apath[d] = k;
                        k = path[k];
                    }
                    ++d;
                    apath[d] = v;
                    cout << apath[d];
                    for (j = d - 1; j >= 0; --j)
                        cout << ", " << apath[j];
                    cout << endl;
                }
            }
    }
    
    void Dijkstra(int v)
    {
        int i, j, Mindis, u;
        for (i = 0; i < vertex_num; ++i)
        {
            dist[i] = matrix[v][i];
            S[i] = 0;
            if (matrix[v][i] < INT_MAX)
                path[i] = v;
            else
                path[i] = -1;
        }
        S[v] = 1;
        for (i = 0; i < vertex_num - 1; ++i)
        {
            Mindis = INT_MAX;
            for (j = 0; j < vertex_num; ++j)
                if (S[j] == 0 && dist[j] < Mindis)
                {
                    u = j;
                    Mindis = dist[j];
                }
            S[u] = 1;
            for (j = 0; j < vertex_num; ++j)
                if (S[j] == 0)
                    if (matrix[u][j] < INT_MAX && dist[u] + matrix[u][j] < dist[j])
                    {
                        dist[j] = dist[u] + matrix[u][j];
                        path[j] = u;
                    }
        }
        Dispath(v);
    }
    
    int main()
    {
        cout << "请输入图的顶点数(<100):";
        cin >> vertex_num;
        cout << "请输入图的边数:";
        cin >> edge_num;
    
        for (int i = 0; i < vertex_num; i++)
            for (int j = 0; j < vertex_num; j++)
                matrix[i][j] = (i != j) ? INT_MAX : 0;  // 初始化 matrix 数组
        cout << "请输入边的信息:
    ";
        int u, v, w;
        for (int i = 0; i < edge_num; i++)
        {
            cin >> u >> v >> w;
            matrix[u][v] = w;
        }
    
        cout << "请输入源点(<" << vertex_num << "):";
        int source;  //源点
        cin >> source;
        Dijkstra(source);
        system("pause");
        return 0;
    }
    View Code

     输出结果:

  • 相关阅读:
    System 类的使用
    StringBuffer 与 StringBuilder类的使用
    String 类 的 使用
    多线程
    音乐播放
    数据库
    表示图编辑
    UITextView(2)
    UITextView
    tarBar
  • 原文地址:https://www.cnblogs.com/sunbines/p/9623353.html
Copyright © 2011-2022 走看看