#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 510, M = 10010, INF = 0x3f3f3f3f;
struct Edge{
int u, v, w;
}edges[M];
int n, m, k, dist[N], backup[N];
void BellmanFord(int s){
memset(dist, 0x3f, sizeof dist);
dist[s] = 0;
for (int i = 0; i < k; i++){
memcpy(backup, dist, sizeof dist);
for (int i = 0; i < m; i++){
int u = edges[i].u, v = edges[i].v, w = edges[i].w;
if (backup[u] + w < dist[v])
dist[v] = backup[u] + w;
}
}
if (dist[n] > INF/2) cout<<"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;
edges[i] = {x, y, z};
}
BellmanFord(1);
return 0;
}
1003 Emergency (25 分)
下面代码只能通过部分测试样例,待完善
#include <iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int N = 510, M = 100010, INF = 0x3f3f3f3f;
int n, m, s, t;
set<int> pre[N];
int dist[N], weight[N], w[N], nums[N];
bool visited[N] = {false};
struct Edge{
int u, v, w;
}edges[M];
//dist[i]表示s->i的最短距离,weight[i]表示顶点i的权值;
//w[i]表示起点s到i的最短路径上结点的权值之和,nums[i]表示起点s->i的最短路径的条数,visited[i]用来标记顶点i是否被访问过
void BellmanFord(int s){
memset(dist, 0x3f, sizeof dist);
memset(w, 0, sizeof w);
memset(nums, 0, sizeof nums);
dist[s] = 0, w[s] = weight[s], nums[s] = 1;
for (int i = 0; i < n-1; i++){
for (int j = 0; j < m; j++){
int u = edges[i].u, v = edges[i].v, we = edges[i].w;
if (dist[u]+we < dist[v]){
dist[v] = dist[u] + we;
w[v] = w[u] + weight[v];
nums[v] = nums[u];
pre[v].clear();
pre[v].insert(u);
}else if (dist[u] + we == dist[v]){
if (w[u] + weight[v] > weight[v])
w[v] = w[u] + weight[v];
nums[v] = 0;
pre[v].insert(u);
for (auto it = pre[v].begin(); it != pre[v].end(); it++){
nums[v] += nums[*it];
}
}
}
}
}
int main(){
cin>>n>>m>>s>>t;
for (int i = 0; i < n; i++) cin>>weight[i];
for (int i = 0; i < m; i++){
int x, y, z;
cin>>x>>y>>z;
edges[i] = {x, y, z};
}
BellmanFord(s);
cout<<nums[t]<<" "<<w[t]<<endl;
return 0;
}