很好,spfa和dijk都是90分
查看原帖
很好,spfa和dijk都是90分
935012
Max6700楼主2024/8/2 23:48

spfa:

#include<bits/stdc++.h>
using namespace std;
const int no=2147483647;
int n,m,s;
int dis[100010];
bool vis[100010];
vector<int> ma[100010],w[100010];

void sp()
{
	queue<int> q;
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	q.push(s);
	vis[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=0;i<ma[u].size();i++)
		{
			int v=ma[u][i];
			if(dis[v]>dis[u]+w[u][i])
			{
				dis[v]=dis[u]+w[u][i];
				if(!vis[v])
				{
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	bool f=0;
	for(int i=1;i<=n;i++)
	{
		f=1;
		cout<<dis[i]<<" ";
	}
	if(!f)cout<<no;
}

int main(){
	
	cin>>n>>m>>s;
	
	for(int i=1;i<=m;i++)
	{
		int u,v,ww;
		cin>>u>>v>>ww;
		ma[u].push_back(v);
		w[u].push_back(ww);
	}
	
	sp();
	
	return 0;
}

dijkstra:

#include<bits/stdc++.h>
using namespace std;

int n,m,s;

vector<int> v[100010],w[100010];

struct aa
{
	int id,len;
};
bool vis[100010];
int dis[100010];

bool operator >(aa x,aa y)
{
	return x.len>y.len;
}

void stra()
{
	priority_queue<aa,vector<aa>,greater<aa>> q;
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	q.push(aa{s,0});
	while(!q.empty())
	{
		int x=q.top().id;
		q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=0;i<v[x].size();i++)
		{
			int y=v[x][i];
			if(!vis[y] && dis[y]>dis[x]+w[x][i])
			{
				dis[y]=dis[x]+w[x][i];
				q.push(aa{y,dis[y]});
			}
		}
	}
}

int main(){
	
	cin>>n>>m>>s;
	
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		v[x].push_back(y);
		w[x].push_back(z);
	}
	
	stra();
	
	for(int i=1;i<=n;i++)
	{
		if(dis[i]<2e9)cout<<dis[i]<<" ";
		else 
		{
			cout<<2147483647<<" ";
		}
	}
	return 0; 
}
2024/8/2 23:48
加载中...