可惜了,,自己感觉是 最短路,,但是没有敲出来,,对于各种细节的处理还要加强。。
比如各种位运算的地方。
#include<bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define bug1 printf("bug1\n");
#define inf 0x3f3f3f3f
int n,m;
int t;
int s1,s2;
const int maxn=(1<<16);
int d[maxn];
int vis[maxn];
void spfa(){
mem(d,inf);
mem(vis,0);
queue<int>q;
q.push(s1);
q.push(s2);
d[s1]=d[s2]=0;
vis[s1]=vis[s2]=1;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
for(int i=0;i<n-1;++i){
int t1=u>>i&1;
int t2=u>>(i+1)&1;
int v=u;
v-=(t1<<i);
v-=(t2<<(i+1));
v+=t2<<i;
v+=t1<<(i+1);
if(d[v]>d[u]+1){
d[v]=d[u]+1;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
pf("%d\n",d[t]);
}
int main(){
while(~sf("%d%d",&n,&m)){
t=0;
for(int i=0;i<n;++i){
int num;sf("%d",&num);
t=(t<<1)+num;
}
s1=s2=0;
int u=0,v=1;
for(int i=0;i<m;++i){
int b;sf("%d",&b);
for(int j=0;j<b;++j){
s1=(s1<<1)+u;
s2=(s2<<1)+v;//位运算太低级了,, 要括号
}
u^=1;v^=1;
}
spfa();
}
}
本文介绍了一种使用 SPFA 算法求解最短路径问题的实例,通过具体的代码实现展示了如何处理复杂的位运算操作以更新节点状态。作者强调了在实现过程中需要注意的细节,特别是位运算的正确使用。
269

被折叠的 条评论
为什么被折叠?



