#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
inline int read()
{
int r = 0, w = 1;
//r是存的这个数的绝对值 w是存的这个数是正数还是负数
char ch = getchar();//ch为当前读入的字符
while (ch < '0' || ch>'9')//如果当前读入的字符不是数字,就一直读入,直到读入的是数字为止
{
if (ch == '-') w = -1;//如果读到了'-',就说明这是个负数
ch = getchar();
}
//运行到这里时ch里面一定是个整数
while (ch >= '0' && ch <= '9')//当读入的字符是数字时一直读入
{
r = r * (1 << 3) + r * (1 << 1) + ch - (1 << 4) - (1 << 5);//存入当前这个数字,由于ch是个字符,所以存入的时候要减去字符0的ASCLL码
//1<<3是8,1<<1是2,加起来就是10 1<<4是16,1<<5是32,加起来就是0的ASCLL码48
ch = getchar();
}
return r * w;
}
struct Edge {
int v, w, next;
};
class Dijkstra_ArrAL {
Edge* E;
int* head, V_num, E_num, cnt;
public:
Dijkstra_ArrAL(int V_num, int E_num) : E(new Edge[E_num]), head(new int[V_num]), V_num(V_num), E_num(E_num), cnt(0) {
memset(head, -1, sizeof(int) * V_num);
for (int i = 0; i < E_num; ++i) {
int u = read(), v = read(), w = read();
AddEdge(--u, --v, w);
}
}
// 头插法加边
void AddEdge(int u, int v, int w) {
E[cnt].v = v;
E[cnt].w = w;
E[cnt].next = head[u];
head[u] = cnt;
++cnt;
}
void solve(int u) {
bool* vis = new bool[V_num] { false };// 存储已处理节点
int* min = new int[V_num];// 存储起点到其他节点的距离,初始化为0x7f7f7f7f
memset(min, 0x7f7f7f7f, sizeof(int) * V_num);
// 处理起点,遍历起点的邻居节点,若有更优路径则替换
for (int i = head[u]; i != -1; i = E[i].next)
if (E[i].w < min[E[i].v])
min[E[i].v] = E[i].w;
vis[u] = true;// 起点已处理
// 处理剩下V_num-1个未处理的节点
for (int i = 1; i < V_num; ++i) {
int ind = -1;
// 找距离起点最近且未被处理过的节点
for (int j = 0; j < V_num; ++j)
if (!vis[j] && (ind == -1 || min[j] < min[ind]))
ind = j;
// ind不可能是-1,所以不用做特判
vis[ind] = true;
// 遍历该节点的邻居节点,若有更优路径则替换
for (int j = head[ind]; j != -1; j = E[j].next)
if (min[ind] + E[j].w < min[E[j].v])
min[E[j].v] = min[ind] + E[j].w;
}
for (int i = 0; i < V_num; ++i) {
if (i == u)
cout << 0 << ' ';
else if (min[i] == 0x7f7f7f7f)
cout << 2147483647 << ' ';
else cout << min[i] << ' ';
}
}
};
int main() {
int v = read(), e = read(), u = read();
Dijkstra_ArrAL G(v, e);
G.solve(--u);
}
这是我的代码,没用快输,快读用的网上的模板 用内联快读,总用时1.02s 而不用内联,总用时0.874s 这是为什么呢?内联不应该省去了跳转、出入栈的时间吗?