52分求调QAQ
查看原帖
52分求调QAQ
1803593
zhangjunyu_sixi楼主2025/8/30 09:59

用小顶堆优化的,结果一直出问题。。。

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct jie
{
	int zi,qu;
};
vector <jie>tu[100005];
int ji[100005],dis[100005],ha[100005],dui[100005],z=0;
void add(int x)
{
	if (z == 0)
	{
		z++;
		dui[z]=x;
		return;
	}
	z++;
	dui[z]=x;
	int fz=z;
	while (fz > 1 and dis[dui[fz/2]] > dis[dui[fz]])
	{
		swap(dui[fz/2],dui[fz]);
		fz/=2;
	}
	return;
}
void shan()
{
	if (z == 0)
	{
		return;
	}
	swap(dui[1],dui[z]);
	z--;
	int fh=1;
	while (1)
	{
	//	cout << "sssl";
		if (fh*2+1 <= z)
		{
			
			if (dis[dui[fh*2+1]] > dis[dui[fh*2]])
			{
				if (dis[dui[fh]] > dis[dui[fh*2]])
				{
					swap(dui[fh],dui[fh*2]);
					fh=fh*2;
				}
				else
				{
					break;
				}
			}
			else
			{
				if (dis[dui[fh]] > dis[dui[fh*2+1]])
				{
					swap(dui[fh],dui[fh*2+1]);
					fh=fh*2+1;
				}
				else
				{
					break;
				}
			}
			
		}
		else if (fh*2 <= z)
		{
			
			if (dis[dui[fh]] > dis[dui[fh*2]])
			{
				swap(dui[fh],dui[fh*2]);
				fh=fh*2;
			}
			else
			{
				break;
			}
			
		}
		else
		{
			break;
		}
		
	}
	return;
	
}
int cha()
{
	while (ha[dui[1]] == 1 and z > 0)
	{
		//cout << "sisis";
		shan();
	}
	if (z > 0)
	{
		int ff=dui[1];
		shan();
		return ff;
	}
	
} 
signed main()
{
	//freopen("P4779_1.in","r",stdin);
	//freopen("P4779_1.out","w",stdout);
	int n,m,s,u,v,w;
	cin >> n >> m >> s;
	for (int i = 1;i <= n;i++)
	{
		dis[i]=LLONG_MAX;
		
		tu[i].push_back({0,0});
	}
	for (int i = 1;i <= m;i++)
	{
		cin >> u >> v >> w;
		tu[u].push_back({v,w});
		ji[u]++;
	}
	ha[s]=1;
	int fz=s,hao;
	dis[s]=0;
	for (int i = 1;i < n;i++)
	{
		for (int j = 1;j <= ji[fz];j++)
		{
			if (ha[tu[fz][j].zi] == 0)
			{
				//dis[tu[fz][j].zi]=min(dis[tu[fz][j].zi],dis[fz]+tu[fz][j].qu);
				if (dis[tu[fz][j].zi] > dis[fz]+tu[fz][j].qu)
				{
					dis[tu[fz][j].zi]=dis[fz]+tu[fz][j].qu;//cout << 66;
					add(tu[fz][j].zi);
					
				}
			}
			//cout << dis[tu[fz][j].zi] << " ";
		}
		//int minn=LLONG_MAX;
		/*for (int j = 1;j <= n;j++)
		{
			if (dis[j] < minn and ha[j] == 0)
			{
			
				minn=dis[j];
				hao=j;//;
			}
		}*/
		hao=cha();
		ha[hao]=1;
		fz=hao;
	}
	for (int i = 1;i <= n;i++)
	{
		cout << dis[i] << " ";
	}
	return 0;
 } 

堆里存的是每个点的标号

2025/8/30 09:59
加载中...