90分蒟蒻求大佬帮助(wa哭了)
查看原帖
90分蒟蒻求大佬帮助(wa哭了)
563650
haochengw920楼主2022/10/12 21:31
//蒟蒻求神犇帮排错(已注释)
//P3371单源最短路弱化版90分,P4779正式版已满分
//本来只是想练练pair准备csp-j的…鬼知道这么恶心
//码风比较差,大佬轻喷 
#include<cstdio>//getchar,putchar
#include<cctype>//isdigit
#include<cstring>//memset
#include<queue>//priority_queue
#include<vector>//vector
#include<utility>//pair
#define fir first
#define sec second
#define mkp make_pair
#define pb emplace_back
#define INF 0x7fffffff
#define Pos pair <int, int>
//不习惯For和Rof 
using namespace std;

inline int read()//快读 
{
		int x = 0, f = 1; char c = getchar();
		while (!isdigit(c)){if (c == '-') f = -1; c = getchar();}
		while (isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
		x *= f; return x;
}
inline void write(int x)//快写 
{
		if (x < 0) putchar ('-'), x = -x;
		if (x >= 10) write(x / 10);
		putchar (x % 10 + '0');
}

const int MAXN = 100005;
vector<Pos> v[MAXN];
priority_queue<Pos, vector<Pos>, greater<Pos> > q;//小顶 
int n, m, s;
int vis[MAXN], dis[MAXN];//是否访问,到起点距离 

void dijkstra(int st)//st起点
{
		//用vector存的邻接表,其他都是模版,不知道是不是这个问题 
		memset(dis, 0x3f, sizeof(dis));
		dis[st] = 0;
		q.push(mkp(0, st));
		
		while (!q.empty())
		{
				int d = q.top().fir, u = q.top().sec;
				q.pop();
				if (vis[u]) continue;
				vis[u] = 1;
				for (int i = 0; i < v[u].size(); ++ i)
				{
						int to = v[u][i].fir, w = v[u][i].sec;
						if (!vis[to] && d + w < dis[to])
						{
								dis[to] = d + w;
								q.push(mkp(dis[to], to));
						}
				}
		}
}

int main()
{
		//读入 
		n = read(); m = read(); s = read();
		for (int i = 0; i < m; ++ i)
		{
				int a, b, k;
				a = read(); b = read(); k = read();
				v[a].pb(mkp(b, k)); 
		} 

		//
		dijkstra(s);
		
		//输出 
		for (int i = 1; i <= n; ++ i)
				if (dis[i] != 0x3f3f3f3f) write(dis[i]), putchar(' ');
				else write(INF), putchar(' ');
		putchar('\n');
		
		return 0;
}

2022/10/12 21:31
加载中...