#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 505,INF = 1e9,mod = 998244354;
int n,m;
int f[N][N];
int ans[N];
int main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for(int i = 1;i <= n; i++){
for(int j = 1;j <= n; j++){
if(i == j) f[i][j] = 0;
else f[i][j] = INF;
}
}
for(int i = 1;i <= m; i++)
{
int u,v,w;
cin >> u >> v >> w;
f[u][v] = min(f[u][v],w);
f[v][u] = min(f[v][u],w);
}
for (int k = 1; k <= n; k++) {
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= n; y++) {
f[x][y] = min(f[x][y], f[x][k] + f[k][y]);
}
}
}
for(int i = 1;i <= n; i++){
for(int j = 1;j <= n; j++){
if(f[i][j] != INF) ans[i] = (ans[i] + f[i][j]) % mod;
}
}
for(int i = 1;i <= n; i++){
cout << ans[i] << endl;
}
return 0;
}
3. 单源最短路径(P4779)
#include<bits/stdc++.h>
using namespace std;
struct edge//链式前向星式存图
{
int v;
int to;
int next;
}e[500005];
//链式前向星
int head[500005],v[500005],cnt;//v数组是迪杰斯特拉中用于存以s为起点,到每个点的最短路径
int vis[500005];//迪杰斯特拉算法,标记点是否走过
int n, m,s;
void add_edge(int u, int v, int l)//链式前向星的加边
{
cnt++;
e[cnt].to = v;
e[cnt].next = head[u];
e[cnt].v = l;
head[u] = cnt;
}
struct node//dijkstra算法中的点,需要存储这个点的坐标和这个点的值
{
int v;//点的值
int pos;//位置
bool operator <(const node& x)const//前问谈到的内置比较函数,否则无法存入优先队列中
{
return x.v < v;
}
};
priority_queue<node> q;//堆优化
void dijkstra()
{
v[s] = 0;//起点设为0
node tmp = { 0,s };
q.push(tmp);//起点的权值为0,位置于起点
{
while (!q.empty())
{
tmp = q.top();
q.pop();
int x = tmp.pos, t = tmp.v;
if (vis[x] == 1) continue;//这个点走过了 ,它的最短路已经被确定
vis[x] = 1;
for (int i = head[x]; i != -1; i = e[i].next)//链式前向星的遍历
{
int y = e[i].to;
if (v[y] > v[x] + e[i].v)//y点的值比x点值加边权大,更新答案
{
v[y] = v[x] + e[i].v;
if (vis[y] == 0)//推入y点,以找到它所能到达的所有点
{
tmp.pos = y;
tmp.v = v[y];
q.push(tmp);
}
}
}
}
}
}
int main()
{
memset(head, -1, sizeof(head));//初始化head数组
cin >> n >> m >> s;
for (int i = 1; i <= n; i++) v[i] = 0x7fffffff;//dijkstra的初始化,每个点的v值初始化为无穷
for (int i = 0; i < m; i++)
{
int u, v, d;
cin >> u >> v >> d;//链式前向星的加边
add_edge(u, v, d);
}
dijkstra();
for (int i = 1; i <= n; i++) cout << v[i]<<" ";
}