为什么用内联函数反而慢了?求大佬解答一个关于“快读快输”的问题
查看原帖
为什么用内联函数反而慢了?求大佬解答一个关于“快读快输”的问题
631458
zjw1198775229楼主2022/11/28 15:13
#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 这是为什么呢?内联不应该省去了跳转、出入栈的时间吗?

2022/11/28 15:13
加载中...