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 }