Dijkstra wa 两个点
查看原帖
Dijkstra wa 两个点
917025
XYzero楼主2023/8/19 16:28
using namespace std;
#define int long long
const int INF=(1LL<<31)-1;
const int maxn = 3e5+10; 
const int maxm = 3e5+10;
int vis[maxn],head[maxm],tt=0;
long long dis[maxn];
struct b{
	int to,nxt,d;
}eadg[maxm];

void add(int x,int y,int z){
	eadg[tt].to=y;
	eadg[tt].d=z;
	eadg[tt].nxt=head[x];
	head[x]=tt++; 
}

struct Point {
	int dd,p;
	bool operator <(const Point &x) const {
	return dd>x.dd;
    }
};

int n,m,s = 1;
void jjb(){
	
	for(int i=1;i<=n;i++){
		dis[i]=INF;
	}
	dis[s]=0;
	memset(vis,0,sizeof(vis));
	priority_queue<Point> q;
	Point a;
	a.dd=0;
	a.p=s;
	q.push(a);
	while(!q.empty()){
		a=q.top();
		q.pop();
		int x=a.p;
		if(vis[x]==1)continue;
		vis[x]=1;
		for(int j=head[x];j!=-1;j=eadg[j].nxt){
			
			int v=eadg[j].to;
			if(dis[v]>dis[x]+1LL*eadg[j].d){
				dis[v]=dis[x]+1LL*eadg[j].d;
				a.dd=dis[v];
				a.p=v;
				q.push(a);
			}
			
		}
	}
}

main(void){
	cin>>n>>m;
	memset(head,-1,sizeof(head));
	while(m--){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	jjb();
	for(int i=1;i<=n;i++){
		if(dis[i] == INF){
			cout << "-1 ";
			continue;
		}
		
		cout<<dis[i]<<" ";
	}
	return 0;
}```
2023/8/19 16:28
加载中...