求算法名
查看原帖
求算法名
751417
diamond_153楼主2022/12/18 12:04

自己想了一个特别拉跨的算法,32pts,不能过题,如果我这个算法有名字求大佬告诉我:

#include<iostream>
#include<map>
#include<vector>
#include<list>
#include<utility>
#define int long long
using namespace std;
int n,m,s;
int dis[301100]={0};
vector<map<int,int>> nexts(301100);//邻接表
void bfs(int s){//算法主体
	for(int i=1;i<=n;i++)
		dis[i]=(1<<31)-1;//初始化
	dis[s]=0;
	list<pair<int,int>> l{{s,0}};//存储
	while(!l.empty()){
		auto front=l.front();
		for(auto i:nexts[front.first]){
			if(dis[i.first]==-1||front.second+i.second<dis[i.first])
				l.push_back({i.first,front.second+i.second}),
					dis[i.first]=front.second+i.second;
		}
		l.pop_front();
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>s;
	for(int i=0;i<m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		if(!nexts[u][v])nexts[u][v]=w;
		else nexts[u][v]=min(nexts[u][v],w);
	}
	bfs(s);
	for(int i=1;i<=n;i++)
		cout<<dis[i]<<" ";
}

算法的思想大概是广搜,先把起点放进队列,再取出队首,将所有与此点相邻的点路径更新。

2022/12/18 12:04
加载中...