32分求调
查看原帖
32分求调
1445073
y_s_j楼主2025/1/17 11:43

Dijkstra算法全部TLE,SPFA算法4个TLE,2个AC……
第一次打最短路,请见谅QAQ……

#include<bits/stdc++.h>//dijkstra
using namespace std;
const int MAXN=1e5+5;
int n,m,s;
int u,v,w;
struct edge
{
	int v,w;
};
vector<edge> e[MAXN];
int dis[MAXN],vis[MAXN];
void work(int n,int s)
{
	memset(dis,0x3f3f3f3f,(n+1)*sizeof(int));
	dis[s]=0;
	for(int i=1;i<=n;i++)
	{
		int u=0,mind=0x3f3f3f3f;
		for(int j=1;j<=n;j++)
			if(!vis[j]&&dis[j]<mind)
			{
				u=j;
				mind=dis[j];
			}
		vis[u]=true;
		for(auto ed:e[u])
		{
			int v=ed.v,w=ed.w;
			if(dis[v]>dis[u]+w)
				dis[v]=dis[u]+w;
		}
	}
}
int main(){
	scanf("%d %d %d ",&n,&m,&s);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d ",&u,&v,&w);
		e[u].push_back(edge{v,w});
	}
	work(n,s);
	for(int i=1;i<=n;i++)
        printf("%d ",dis[i]);
	return 0;
}
#include<bits/stdc++.h>//SPFA
using namespace std;
const int MAXN=1e5+5;
int n,m,s;
int u,v,w;
struct edge
{
	int v,w;
};
vector<edge> e[MAXN];
int dis[MAXN],vis[MAXN],cnt[MAXN];
queue<int> q;
void work(int n,int s)
{
	memset(dis,0x3f3f3f3f,(n+1)*sizeof(int));
	dis[s]=0,vis[s]=1;
	q.push(s);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(auto ed:e[u])
		{
			int v=ed.v,w=ed.w;
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>=n)
					return ;
				if(!vis[v])
				{
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	return ;
}
int main(){
	scanf("%d %d %d ",&n,&m,&s);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d ",&u,&v,&w);
		e[u].push_back(edge{v,w});
	}
	work(n,s);
	for(int i=1;i<=n;i++)
		printf("%d ",dis[i]);
	return 0;
}
2025/1/17 11:43
加载中...