首页 > 其他 > 详细

51Nod 1693 水群

时间:2017-09-12 17:30:03      阅读:214      评论:0      收藏:0      [点我收藏+]

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 水群

原文:http://www.cnblogs.com/chen74123/p/7511016.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!