dij为什么会t一个点?<help!!!>
查看原帖
dij为什么会t一个点?<help!!!>
987871
hopelessness楼主2023/8/5 12:30

这代码标准版AC,这里t一个点

#include<bits/stdc++.h>
//#include<vector>
//#include<queue>
#define MAXN 100020
#define INF 2147483647
#define il inline
using namespace std;
vector<int> mp[MAXN];
vector<int> val[MAXN];
int dis[MAXN];
bool vis[MAXN];
int be,ed,x,y,z,n,m;
struct edge {
	int sum,v;
};
bool operator < (edge a,edge b) {
	return a.v>b.v;
}
priority_queue<edge> q;
il void read(int &x) {
	char c=getchar();
	x=0;
	int f=0;
	for(; !isdigit(c); c=getchar()) f|=(c=='-');
	for(; isdigit(c); c=getchar()) x=((x<<3)+(x<<1)+(c^48));
	x=f?-x:x;
}
il void Dijkstra(int u) {
	for(int i=1; i<=n; i++) dis[i]=INF;
	dis[u]=0;
	edge h;
	h.sum=u;
	h.v=0;
	q.push(h);
	for(int j=1; j<=n; j++) {
		while(vis[q.top().sum]) q.pop();
		h=q.top();
		vis[h.sum]=true;
		for(int i=0; i<mp[h.sum].size(); i++) {
			int d=mp[h.sum][i];
			if(dis[d]>dis[h.sum]+val[h.sum][i]) {
				dis[d]=dis[h.sum]+val[h.sum][i];
				edge p;
				p.sum=d;
				p.v=dis[d];
				q.push(p);
			}
		}
	}
	return ;
}
int main() {
	read(n);
	read(m);
	read(be);//begin point
//	scanf("%d",&ed);//end point
	for(int i=1; i<=m; i++) {
//		scanf("%d%d%d",&x,&y,&z);
		read(x);
		read(y);
		read(z);
		mp[x].push_back(y);
		val[x].push_back(z);
	}
//	for(int i=1;i<=n;i++){
//		printf("%d %d %d\n",be,i,dis[i]);
//	}
	Dijkstra(be);
	for(int i=1; i<=n; i++) {
		printf("%d ",dis[i]);
	}
	return 0;
}
2023/8/5 12:30
加载中...