算导2(原点终点最短路)

5. Shortestpath in multistage graphs. Find the shortest path from 0 to 15 for the followinggraph.

A multistagegraph is a graph (1) G=(V,E) with V partitioned into K>= 2 disjoint subsets such that if (a,b) is in E,then a is in Vi , and b is in Vi+1 for somesubsets in the partition; and (2) | V1 | = |VK | = 1.

方法一:

   此问题可以用Floyed算法。Floyed不需要使用贪心法从小到大选择。而是使用动态规划。使用的方程是:Graph[i][j] =min(dest[i][j], dest[i][k] +dest[k][j]);也就是在每次循环时,把k当做中间节点,看是否加入节点k能得到更小的值。这道题会更新矩阵16次,这是因为总共有16个节点所以要循环16次。每次更新矩阵都是根据最近一次矩阵更新的结果。

 if(i!=j&&j!=k&&i!=k)是因为i== j,就是自己到自己,不用更新。而若存在j == k或者i == k,则dest[i][i] == 0,也不用更新。

 若想打印出从原点到终点的最短路径,则可以用print()函数进行递归调用。定义一个矩阵value[16][16],用来存储每次i到j更新加入的k值(节点)。用value[0][t]递归访问,即可打出经过的节点数。
  不过floyed的时间复杂度是O(n^3),比较慢。

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
#define INF 0x1f1f1f1f
int dest[16][16];
int value[16][16];
void Floyed(int dest[][16])
{
    for(int k=0;k<16; k++)
       for(int i=0; i<16; i++)
           for(int j=0; j<16; j++)
           {
               if(i!=j&&j!=k&&i!=k)
               {
                   if(dest[i][j]>dest[i][k]+dest[k][j])
                   {
                       dest[i][j] = dest[i][k]+dest[k][j];
                       value[i][j] = k;
                   }
               }
           }
}
void print(int t)
{
   if(value[0][t] == 0)
                  return;
    cout<< value[0][t]<< " ";
   print(value[0][t]);
}
int main()
{
    int v, u,e;
    cin>> v >>u >> e;
    memset(dest,INF, sizeof(dest));
    while(!(v==0 && u == 0&& e == 0))
    {
             dest[v][u] = e;
             cin >> v>> u >>e;
    }
   Floyed(dest);
    cout<< dest[0][15]<< endl;
   
    for(int i =0; i < 16; i++)
    {
           for(int j = 0; j < 16; j++)
           {
                   cout << value[i][j]<< " ";
           }
           cout << endl;
    }
    cout<< "经过的点分别是:"<<endl;
   print(15);
   system("pause");
    return0;
}


 

方法二:

使用递归的dp。

#include <iostream>
using namespace std;
#define inf 1<<20
int n,a[16][16],d[16];
int dp(int i)
{
    if(i ==15)
        return d[i]=0;
    if(d[i] !=0)
           return d[i];
    int min =9999999, t;
    for(int j =0; j <= 15; j++)
       if(a[i][j] != 0 && i != j)
       {
                  t = dp(j) + a[i][j];
                  if(t < min)
                       min=t;
        }
    return d[i] = min;
}
int main()
{
    int v, u, e;
    cin >> v>> u >>e;
    while(!(v == 0 && u == 0&& e == 0))
    {
         a[v][u] = e;
         cin >> v>> u >>e;
   } 
    memset(d, 0,sizeof(d));
    cout<< dp(0)<< endl;//1到n-1个矩阵 矩阵i的左右为 i-1,i
    for(int i =0; i < 16; i++)
        cout << d[i]<< " ";
   system("pause");
    return0;


}
方法三:
使用Dijstra算法。

Dijkstra算法的时间效率依赖于用来实现优先队列的数据结构以及用来表示输入图本身的数据结构,如果图用权重矩阵表示,优先队列用无序数组来实现,该算法属于O(|V|*|V|).如果图用邻接链表表示,优先队列用最小堆来实现,该算法属于O(|E|log|v|).如果用一种斐波那契堆的更复杂的数据结构来实现优先队列,它的最差效率会更好一些。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Practice 1 Date: Monday, March 18th, 2013 We highly encourage being environment friendly and trying all problems on your own. Implement exercise 2.3-7. Implement priority queue. Implement Quicksort and answer the following questions. (1) How many comparisons will Quicksort do on a list of n elements that all have the same value? (2) What are the maximum and minimum number of comparisons will Quicksort do on a list of n elements, give an instance for maximum and minimum case respectively. Give a divide and conquer algorithm for the following problem: you are given two sorted lists of size m and n, and are allowed unit time access to the ith element of each list. Give an O(lg m + lgn) time algorithm for computing the kth largest element in the union of the two lists. (For simplicity, you can assume that the elements of the two lists are distinct). Practice 2 Date: Monday, April 1st, 2013 We highly encourage being environment friendly and trying all problems on your own. Matrix-chain product. The following are some instances. Longest Common Subsequence (LCS). The following are some instances. X: xzyzzyx Y: zxyyzxz X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD Y:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG Longest Common Substring. The following are some instances. X: xzyzzyx Y: zxyyzxz X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD Y:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG Max Sum. The following is an instance. (-2,11,-4,13,-5,-2) Shortest path in multistage graphs. Find the shortest path from 0 to 15 for the following graph.   A multistage graph is a graph (1) G=(V,E) with V partitioned into K >= 2 disjoint subsets such that if (a,b) is in E, then a is in Vi , and b is in Vi+1 for some subsets in the partition; and (2) | V1 | = | VK | = 1.     Practice 3 Date: Monday, April 15th, 2013 We highly encourage being environment friendly and trying all problems on your own. Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem both as fractional knapsack and 0/1 knapsack. A simple scheduling problem. We are given jobs j1, j2… jn, all with known running times t1, t2… tn, respectively. We have a single processor. What is the best way to schedule these jobs in order to minimize the average completion time. Assume that it is a nonpreemptive scheduling: once a job is started, it must run to completion. The following is an instance. (j1, j2, j3, j4) : (15,8,3,10) Single-source shortest paths. The following is the adjacency matrix, vertex A is the source.  A B C D E A -1 3 B 3 2 2 C D 1 5 E -3 All-pairs shortest paths. The adjacency matrix is as same as that of problem 3.(Use Floyd or Johnson’s algorithm)     Practice 4 Date: Monday, May 8th, 2013 We highly encourage being environment friendly and trying all problems on your own. 0/1 Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem using back-tracking algorithm and try to draw the tree generated. Solve the 8-Queen problem using back-tracking algorithm.    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值