有边数限制的最短路

思路:

(1)注意到要在边数限制条件下求最短路,且存在负权,于是考虑Bellman_Ford算法;

(2)存图:只需将边及权按结构体存储即可。

(3)Bellman_Ford算法:

  1. 一个一个的添加路径,添加k次,刚好k个边;
  2. 每次用上次的dist[]状态,对每条边尝试进行路径优化;
  3. 操作结束后判定dist[n],如果大于0x3f3f3f3f /2说明k条边不可达,反之则可达输出。

代码:

#include

using namespace std;
int n,m,k;
const int N = 510;
const int M = 1e4 + 10;

int dist[N],backup[N];
struct Edge
{
    int x,y,z;
}edge[M];

void bellman_ford()
{
    memset(dist,0x3f,sizeof dist);
    dist[1] = 0;
    
    for(int i = 0;i < k;i ++)
    {
        memcpy(backup,dist,sizeof dist);
        
        for(int j = 0;j < m;j ++)
        {
            int x = edge[j].x;
            int y = edge[j].y;
            int z = edge[j].z;
            
            dist[y] = min(dist[y],backup[x] + z);
        }
    }
    
    if(dist[n] > 0x3f3f3f3f/2) puts("impossible");
    else cout << dist[n];
}

int main()
{
    cin >> n >> m >> k;
    
    for(int i = 0;i < m;i ++)
    {
        int x,y,z;
        cin >> x >> y >> z;
        edge[i] = {x,y,z};
    }
    
    bellman_ford();
    
    
    return 0;
}

你可能感兴趣的:(算法,数据结构)