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
",dis[n]);
48     return 0;
49 }
View Code
原文地址:https://www.cnblogs.com/chen74123/p/7511016.html