【问题描述】给定一个非负的加权有向图G,求其中任意两个节点之间的最短路径。
【输入形式】输入的第1行包含2个整数n和m,表示图G中包含n个节点和m条边。接下来m行,每行中有3个整数i,j,w,表示从节点i到节点j存在一条边(节点编号从1开始),该边的权重为w。
【输出形式】
输出最短路径矩阵,共包含n行,每行包含n个数字(数字之间使用空格分割),表示该节点到其他节点的最短距离。
特别地,节点到自身的距离定义为0;如果节点之间无法到达,使用1e9+7表示他们之间的距离。
【样例输入】
3 5
1 2 2
1 3 9
2 1 8
2 3 6
3 1 1
【样例输出】
0 2 8
7 0 6
1 3 0
【思考】如果出现负边,如何进行改进
#include<bits/stdc++.h>
#define N 10000
using namespace std;
int c,n;
int s[N]={0},v[N]={0};
int dp[N][N];
int main()
{
cin>>c>>n;
for(int i=1;i<=n;i++) cin>>s[i]>>v[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=c;j++)
{
if(j>=s[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-s[i]]+v[i]);
else dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][c];
return 0;
}