有向無環圖求最長路
阿新 • • 發佈:2019-02-14
[cpp]
view plain
copy
print?
[cpp] view plain copy print?
[cpp] view plain copy print?
輸出結果:
- // A C++ program to find single source longest distances in a DAG
- #include <iostream>
- #include <list>
- #include <stack>
- #include <limits.h>
- #define NINF INT_MIN
- usingnamespace std;
- //圖通過鄰接表來描述。鄰接表中的每個頂點包含所連線的頂點的資料,以及邊的權值。
- class AdjListNode
- {
- int v;
- int weight;
- public:
- AdjListNode(int _v, int _w) { v = _v; weight = _w;}
- int getV() { return v; }
- int getWeight() { return weight; }
- };
- // Class to represent a graph using adjacency list representation
- class Graph
- {
- int V; // No. of vertices’
- // Pointer to an array containing adjacency lists
- list<AdjListNode> *adj;
- // A function used by longestPath
- void topologicalSortUtil(int v, bool visited[], stack<int> &Stack);
- public:
- Graph(int V); // Constructor
- // function to add an edge to graph
- void addEdge(int u, int v, int weight);
- // Finds longest distances from given source vertex
- void longestPath(int s);
- };
- Graph::Graph(int V) // Constructor
- {
- this->V = V;
- adj = new list<AdjListNode>[V];
- }
- void Graph::addEdge(int u, int v, int weight)
- {
- AdjListNode node(v, weight);
- adj[u].push_back(node); // Add v to u’s list
- }
- // 通過遞迴求出拓撲序列. 詳細描述,可參考下面的連結。
- // http://www.geeksforgeeks.org/topological-sorting/
- void Graph::topologicalSortUtil(int v, bool visited[], stack<int> &Stack)
- {
- // 標記當前頂點為已訪問
- visited[v] = true;
- // 對所有鄰接點執行遞迴呼叫
- list<AdjListNode>::iterator i;
- for (i = adj[v].begin(); i != adj[v].end(); ++i)
- {
- AdjListNode node = *i;
- if (!visited[node.getV()])
- topologicalSortUtil(node.getV(), visited, Stack);
- }
- // 當某個點沒有鄰接點時,遞迴結束,將該點存入棧中。
- Stack.push(v);
- }
// A C++ program to find single source longest distances in a DAG
#include <iostream>
#include <list>
#include <stack>
#include <limits.h>
#define NINF INT_MIN
using namespace std;
//圖通過鄰接表來描述。鄰接表中的每個頂點包含所連線的頂點的資料,以及邊的權值。
class AdjListNode
{
int v;
int weight;
public:
AdjListNode(int _v, int _w) { v = _v; weight = _w;}
int getV() { return v; }
int getWeight() { return weight; }
};
// Class to represent a graph using adjacency list representation
class Graph
{
int V; // No. of vertices’
// Pointer to an array containing adjacency lists
list<AdjListNode> *adj;
// A function used by longestPath
void topologicalSortUtil(int v, bool visited[], stack<int> &Stack);
public:
Graph(int V); // Constructor
// function to add an edge to graph
void addEdge(int u, int v, int weight);
// Finds longest distances from given source vertex
void longestPath(int s);
};
Graph::Graph(int V) // Constructor
{
this->V = V;
adj = new list<AdjListNode>[V];
}
void Graph::addEdge(int u, int v, int weight)
{
AdjListNode node(v, weight);
adj[u].push_back(node); // Add v to u’s list
}
// 通過遞迴求出拓撲序列. 詳細描述,可參考下面的連結。
// http://www.geeksforgeeks.org/topological-sorting/
void Graph::topologicalSortUtil(int v, bool visited[], stack<int> &Stack)
{
// 標記當前頂點為已訪問
visited[v] = true;
// 對所有鄰接點執行遞迴呼叫
list<AdjListNode>::iterator i;
for (i = adj[v].begin(); i != adj[v].end(); ++i)
{
AdjListNode node = *i;
if (!visited[node.getV()])
topologicalSortUtil(node.getV(), visited, Stack);
}
// 當某個點沒有鄰接點時,遞迴結束,將該點存入棧中。
Stack.push(v);
}
[cpp] view plain copy print?
- // 根據傳入的頂點,求出到到其它點的最長路徑. longestPath使用了
- // topologicalSortUtil() 方法獲得頂點的拓撲序。
- void Graph::longestPath(int s)
- {
- stack<int> Stack;
- int dist[V];
- // 標記所有的頂點為未訪問
- bool *visited = newbool[V];
- for (int i = 0; i < V; i++)
- visited[i] = false;
- // 對每個頂點呼叫topologicalSortUtil,最終求出圖的拓撲序列存入到Stack中。
- for (int i = 0; i < V; i++)
- if (visited[i] == false)
- topologicalSortUtil(i, visited, Stack);
- //初始化到所有頂點的距離為負無窮
- //到源點的距離為0
- for (int i = 0; i < V; i++)
- dist[i] = NINF;
- dist[s] = 0;
- // 處理拓撲序列中的點
- while (Stack.empty() == false)
- {
- //取出拓撲序列中的第一個點
- int u = Stack.top();
- Stack.pop();
- // 更新到所有鄰接點的距離
- list<AdjListNode>::iterator i;
- if (dist[u] != NINF)
- {
- for (i = adj[u].begin(); i != adj[u].end(); ++i)
- if (dist[i->getV()] < dist[u] + i->getWeight())
- dist[i->getV()] = dist[u] + i->getWeight();
- }
- }
- // 列印最長路徑
- for (int i = 0; i < V; i++)
- (dist[i] == NINF)? cout << "INF ": cout << dist[i] << " ";
- }
// 根據傳入的頂點,求出到到其它點的最長路徑. longestPath使用了
// topologicalSortUtil() 方法獲得頂點的拓撲序。
void Graph::longestPath(int s)
{
stack<int> Stack;
int dist[V];
// 標記所有的頂點為未訪問
bool *visited = new bool[V];
for (int i = 0; i < V; i++)
visited[i] = false;
// 對每個頂點呼叫topologicalSortUtil,最終求出圖的拓撲序列存入到Stack中。
for (int i = 0; i < V; i++)
if (visited[i] == false)
topologicalSortUtil(i, visited, Stack);
//初始化到所有頂點的距離為負無窮
//到源點的距離為0
for (int i = 0; i < V; i++)
dist[i] = NINF;
dist[s] = 0;
// 處理拓撲序列中的點
while (Stack.empty() == false)
{
//取出拓撲序列中的第一個點
int u = Stack.top();
Stack.pop();
// 更新到所有鄰接點的距離
list<AdjListNode>::iterator i;
if (dist[u] != NINF)
{
for (i = adj[u].begin(); i != adj[u].end(); ++i)
if (dist[i->getV()] < dist[u] + i->getWeight())
dist[i->getV()] = dist[u] + i->getWeight();
}
}
// 列印最長路徑
for (int i = 0; i < V; i++)
(dist[i] == NINF)? cout << "INF ": cout << dist[i] << " ";
}
[cpp] view plain copy print?
- // Driver program to test above functions
- int main()
- {
- // Create a graph given in the above diagram. Here vertex numbers are
- // 0, 1, 2, 3, 4, 5 with following mappings:
- // 0=r, 1=s, 2=t, 3=x, 4=y, 5=z
- Graph g(6);
- g.addEdge(0, 1, 5);
- g.addEdge(0, 2, 3);
- g.addEdge(1, 3, 6);
- g.addEdge(1, 2, 2);
- g.addEdge(2, 4, 4);
- g.addEdge(2, 5, 2);
- g.addEdge(2, 3, 7);
- g.addEdge(3, 5, 1);
- g.addEdge(3, 4, -1);
- g.addEdge(4, 5, -2);
- int s = 1;
- cout << "Following are longest distances from source vertex " << s <<" \n";
- g.longestPath(s);
- return 0;
- }
// Driver program to test above functions
int main()
{
// Create a graph given in the above diagram. Here vertex numbers are
// 0, 1, 2, 3, 4, 5 with following mappings:
// 0=r, 1=s, 2=t, 3=x, 4=y, 5=z
Graph g(6);
g.addEdge(0, 1, 5);
g.addEdge(0, 2, 3);
g.addEdge(1, 3, 6);
g.addEdge(1, 2, 2);
g.addEdge(2, 4, 4);
g.addEdge(2, 5, 2);
g.addEdge(2, 3, 7);
g.addEdge(3, 5, 1);
g.addEdge(3, 4, -1);
g.addEdge(4, 5, -2);
int s = 1;
cout << "Following are longest distances from source vertex " << s <<" \n";
g.longestPath(s);
return 0;
}
輸出結果: