51Nod 1693 水群

Posted Alex丶Baker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod 1693 水群相关的知识,希望对你有一定的参考价值。

1693 水群技术分享

题意是求从1状态到n状态最少需要多少体力

可以以体力建边,跑最短路

每个点向他的质数倍数(质数k<=13)连边,并向这个点-1连边

spfa

技术分享
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 1000000+15
 4 int n,m,dis[maxn],p[6]={2,3,5,7,11,13};
 5 
 6 void spfa(int s)
 7 {
 8     queue<int>que;
 9     bool vis[maxn];
10     memset(dis,0x3f,sizeof(dis));
11     memset(vis,false,sizeof(vis));
12     dis[s]=0; vis[s]=true;
13     que.push(s);
14     while(!que.empty())
15     {
16         int cur=que.front(); que.pop();
17         for(int i=0;i<6;i++)
18         {
19             if(cur*p[i]<n+4&&dis[cur]+p[i]<dis[cur*p[i]])
20             {
21                 dis[cur*p[i]]=dis[cur]+p[i];
22                 if(!vis[cur*p[i]])
23                 {
24                     vis[cur*p[i]]=true;
25                     que.push(cur*p[i]);
26                 }
27             }
28             
29         }
30         if(dis[cur]+1<dis[cur-1]&&cur>0)
31         {
32             dis[cur-1]=dis[cur]+1;
33             if(!vis[cur-1])
34             {
35                 vis[cur-1]=true;
36                 que.push(cur-1);
37             }
38         }
39         vis[cur]=false;
40     }
41 }
42 
43 int main()
44 {
45     scanf("%d",&n);
46     spfa(1);
47     printf("%d\n",dis[n]);
48     return 0;
49 }
View Code

 

以上是关于51Nod 1693 水群的主要内容,如果未能解决你的问题,请参考以下文章

51nod1693 水群

51nod 1693 水群(Dijkstra)

51nod1693 水群 最短路

最短路 51Nod1693 水群

51nod1693

51nod1563