求调CF D
  • 板块学术版
  • 楼主_JF_殉情
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/10 21:45
  • 上次更新2023/10/24 04:49:28
查看原帖
求调CF D
361141
_JF_殉情楼主2023/1/10 21:45
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
int ans[N],n,a[N],t1[N];
struct node
{
	int v,w;
};
bool prime(int x)
{
	if(x==2)
		return true;
	for(int i=2;i<sqrt(x);i++)
		if(x%i==0)
			return false;
	return true;
}
vector<node> g[N<<1];
int dis[N],vis[N<<1],from[N];
void dijkstra(int s)
{
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
		dis[i]=INT_MAX;
	dis[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		int u=q.top().second;
		q.pop();
		if(t1[u]==0||!prime(u))
			continue;
		vis[u]=1;
		for(int i=0;i<g[u].size();i++)
		{
			int v=g[u][i].v;
			if(dis[v]>dis[u]+g[u][i].w)
			{
				from[v]=u;
				dis[v]=dis[u]+g[u][i].w;
				q.push(make_pair(dis[v],v));
			}
		}
	}
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n;
	int maxx=-INT_MAX;
	for(int i=1;i<=n;i++)
		cin>>a[i],t1[a[i]]=i,maxx=max(maxx,a[i]);
	for(int i=2;i<=maxx;i++)
		for(int j=2;j<=maxx/i;j++)
			g[i].push_back({i*j,1}),g[i*j].push_back({i,1});
	int s,t;
	cin>>s>>t;
	s=a[s],t=a[t];
	dijkstra(s);
	cout<<dis[t]<<endl;
//	if(dis[t]==INT_MAX)
//		cout<<"-1"<<endl,exit(0);
//	else
//	{
//		int sum=0;
//		while(from[t]!=s)
//		{	
//			sum++;
//			ans[sum]=t1[t];
//			t=from[t];
//		}
//		cout<<sum<<endl;
//		cout<<s<<" ";
//		for(int i=sum;i>=1;i--)
//			cout<<ans[i]<<" ";
//		cout<<endl;
//	}
	return 0;
}

rt,本人输出的dis是错的,但不知道怎么调了

2023/1/10 21:45
加载中...