比赛 |
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是美德
}