比赛 2024暑假C班集训A 评测结果 WAWWWWEEEW
题目名称 行动!行动! 最终得分 10
用户昵称 喵喵喵 运行时间 0.739 s
代码语言 C++ 内存使用 10.96 MiB
提交时间 2024-07-10 09:52:26
显示代码纯文本
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
vector<int> g[10005]; // g是邻接表
int dis[10005],exist[10005]; // dis是距离,exist表示一个顶点是否在队列里
int w[7505][7505]; // w是边权值
int n,m,k,s,e;
void SPFA(int s)
{
	memset(dis,0x3f,sizeof(dis)); // 初始化dis数组,初始值无穷远
	memset(exist,false,sizeof(exist)); // 初始化exist数组
	queue<int> q; // 声明一个队列q
	q.push(s); // 压入起点s
	exist[s] = true; // s在队列中
	dis[s] = 0; // 起点到起点肯定是0啊(*゜ー゜*)
	while(!q.empty()) // 当还能松弛
	{
		int x = q.front(); // 弹出队首元素x
		q.pop();
		exist[x] = 0; // 队首元素x不在队列中了
		for(int y = 0;y < g[x].size();y++) // 扫一遍x的邻接表
		{
			if(dis[g[x][y]] > dis[x] + w[x][g[x][y]]) // 如果有x的邻接顶点到起点的距离能变得更小
			{
				dis[g[x][y]] = dis[x] + w[x][g[x][y]]; // 改dis数组
				if(!exist[g[x][y]]) // 如果该顶点没有在队列里
				{
					q.push(g[x][y]); // 应当将它压入队列,因为一个顶点的改变可能会影响其他顶点
					exist[g[x][y]] = true; // 记得改状态
				}
			}
		}
	}
	return;
}
int main()
{
	freopen("move.in","r",stdin); // 文件输入输出
	freopen("move.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k); // 输入
	scanf("%d%d",&s,&e); // 输入
	int a,b,t;
	for(int i = 0;i < m;i++)
	{
		scanf("%d%d%d",&a,&b,&t); // 循环输入
		g[a].push_back(b); // 存储到邻接表
		g[b].push_back(a); // 存储到邻接表
		w[a][b] = t; // 存储到权值表
		w[b][a] = t; // 存储到权值表
	}
	SPFA(s); // 单源最短路
	printf("%d\n",dis[e]); // 输出
	return 0; // 记得return是美德
}