求助,我照着题解的思路打了一遍,但是却连样例都过不了
查看原帖
求助,我照着题解的思路打了一遍,但是却连样例都过不了
158652
IQ勇士楼主2022/8/10 09:24

我的代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n, m, st;
struct edge{
	int to;
	int q;
	int next;
}e[500001];
int cnt, head[10001], s, now, minn;
long long dis[10001];
bool vis[10001];
void add(int u, int v, int w)
{
	e[cnt++].to = v;
	e[cnt].q = w;
	e[cnt].next = head[u];
	head[u] = cnt;
}
int main()
{
	cin >> n >> m >> st;
	for(int i = 1; i <= n; i++)
		dis[i] = 2147483647;
	dis[st] = 0;
	for(int i = 1; i <= m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
	}
	now = st;
	while(!vis[now])
	{
		minn = 2147483647;
		vis[now] = 1;
		for(int i = head[now]; i; i = e[i].next)
			if(!vis[e[i].to] && dis[e[i].to] > dis[now] + e[i].q)
				dis[e[i].to] = dis[now] + e[i].q;
		for(int i = 1; i <= n; i++)
		{
			if(dis[i] < minn && !vis[i])
			{
				minn = dis[i];
				now = i;
			}
		}
	}
	for(int i = 1; i <= n; i++)
		cout << dis[i] << ' ';
	return 0;
}

题解代码:

#include<iostream>
using namespace std;
int head[100000],cnt;
long long ans[1000000];
bool vis[1000000];
int m,n,s;
struct edge
{
	int to;
	int nextt;
	int wei;
}edge[1000000];
void addedge(int x,int y,int z)
{
	edge[++cnt].to=y;
	edge[cnt].wei=z;
	edge[cnt].nextt=head[x];
	head[x]=cnt;
}
int main()
{
	cin>>m>>n>>s;
	for(int i=1;i<=n;i++)
	{
		ans[i]=2147483647;
	}
	ans[s]=0;
	for(int i=1;i<=n;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		addedge(a,b,c);
	}
	int pos=s;
	while(vis[pos]==0)
	{
		long long minn=2147483647;
		vis[pos]=1;
		for(int i=head[pos];i!=0;i=edge[i].nextt)
		{
			if(!vis[edge[i].to]&&ans[edge[i].to]>ans[pos]+edge[i].wei)
			{
				ans[edge[i].to]=ans[pos]+edge[i].wei;
			}
		}
		for(int i=1;i<=m;i++)
		{
			if(ans[i]<minn&&vis[i]==0)
			{
				minn=ans[i];
				pos=i;
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		cout<<ans[i]<<' ';
	}
}

2022/8/10 09:24
加载中...