【题目描述】
给定一个
n
n
n个点
m
m
m条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出从
1
1
1号点到
n
n
n号点的最多经过
k
k
k条边的最短距离,如果无法从
1
1
1号点走到
n
n
n号点,输出impossible。
注意:图中可能存在负权回路。
【输入格式】
第一行包含三个整数
n
,
m
,
k
n,m,k
n,m,k。
接下来
m
m
m行,每行包含三个整数
x
,
y
,
z
x,y,z
x,y,z,表示存在一条从点
x
x
x到点
y
y
y的有向边,边长为
z
z
z。
【输出格式】
输出一个整数,表示从
1
1
1号点到
n
n
n号点的最多经过
k
k
k条边的最短距离。
如果不存在满足条件的路径,则输出impossible。
【数据范围】
1
≤
n
,
k
≤
500
1≤n,k≤500
1≤n,k≤500
1
≤
m
≤
10000
1≤m≤10000
1≤m≤10000
任意边长的绝对值不超过
10000
10000
10000。
【输入样例】
3 3 1 1 2 1 2 3 1 1 3 3
【输出样例】
3
#include#include #include using namespace std; const int N = 510, M = 10010; int n, m, k; int dis[N], backup[N];//backup用来备份dis数组防止出现串联问题 struct Edge { int x, y, w; }e[M]; void bellman_ford() { memset(dis, 0x3f, sizeof dis); dis[1] = 0; //最多经过k条边的最短路 for (int i = 0; i < k; i++) { memcpy(backup, dis, sizeof dis);//备份上一次的最短距离 for (int j = 0; j < m; j++)//遍历每条边,更新最短距离 dis[e[j].y] = min(dis[e[j].y], backup[e[j].x] + e[j].w); } } int main() { cin >> n >> m >> k; for (int i = 0; i < m; i++) cin >> e[i].x >> e[i].y >> e[i].w; bellman_ford(); dis[n] > 0x3f3f3f3f / 2 ? cout << "impossiblen" : cout << dis[n] << endl; return 0; }



