图论算法

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

 输出结果:

原文地址:https://www.cnblogs.com/sunbines/p/9623353.html