求助 WA#6
查看原帖
求助 WA#6
474692
Creative_sad_yosgic楼主2023/1/8 20:11

用的是堆优化的dijkstra 存图方式奇怪不用在意

#include<bits/stdc++.h>
using namespace std;
int dis[311111],vis[311111];
vector<int> mp[311111];
map<int,map<int,int> > w;
int s;
typedef struct edge{
	int num,dis;
	bool operator < (const edge &b) const{
		return dis>b.dis;
	}
};
priority_queue<edge> q;
void dijkstra(int x,int st){
	memset(dis,0x3f,sizeof(dis));
	dis[st]=0;
    edge y;
	y.num=st;
	y.dis=0;
	q.push(y);
	while(!q.empty()){
		edge c=q.top();
		q.pop();
		if(vis[c.num]) continue;
		vis[c.num]=1;
		for(int i=0;i<mp[c.num].size();i++)
		{
			if(dis[mp[c.num][i]]>dis[c.num]+w[c.num][mp[c.num][i]]){
				dis[mp[c.num][i]]=dis[c.num]+w[c.num][mp[c.num][i]];
				if(!vis[mp[c.num][i]])
				q.push((edge){mp[c.num][i],dis[mp[c.num][i]]});
			}
		}
	}
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	//freopen("6.in","r",stdin);
	//freopen("6.out","w",stdout);
	int n,m,s;
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int x,y,w1;
		cin>>x>>y>>w1;
		mp[x].push_back(y);
		if(w[x][y]) w[x][y]=min(w[x][y],w1);
		else w[x][y]=w1;
	}
	dijkstra(n,s);
	for(int i=1;i<=n;i++){
		if(dis[i]!=0x3f3f3f3f) cout<<dis[i]<<" ";
		else cout<<2147483647<<" ";
	}
	return 0;
}
2023/1/8 20:11
加载中...