dij求助
查看原帖
dij求助
127925
Kio_楼主2020/10/31 20:13

RT,只拿到了20pts,求助

#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int n,m,s;
struct pt{
	int id,d;
	bool operator > (const pt &a) const {
		return d<a.d;
	}
};
vector<pt> v[100020];
bool pd[100020];
void dij(){
	priority_queue<pt, vector<pt>, greater<pt> >q;
	int dis[100020];
	for(int i=1;i<=n;i++) dis[i] = 2147483647;
	dis[s]=0;
	q.push((pt){s,0});
	while(!q.empty()){
		pt x = q.top();
		q.pop();
		int xi = x.id, xdis = x.d;
		if(pd[xi])continue;
		pd[xi]=1;
		for(int i=0; i<v[xi].size();i++){
			int yi = v[xi][i].id, ydis = v[xi][i].d;
			if(dis[yi] > dis[xi] + ydis){
				dis[yi] = dis[xi] + ydis;
				if(!pd[yi]) q.push((pt){yi,dis[yi]});
			}
		}
	}
	for(int i=1;i<=n;i++){
		printf("%d ",dis[i]);
	}
}
int read(){
	int num=0;
	char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while('0'<=c&&c<='9') num=num*10+c-'0',c=getchar();
	return num;
}
int main(){
	n=read(),m=read(),s=read();
	for(int i=1;i<=m;i++){
		int ui=read(),vi=read(),di=read();
		v[ui].push_back((pt){vi,di});
	}
	dij();
	return 0;
}

谢谢大佬!

2020/10/31 20:13
加载中...