社区讨论
SPFA做法25PTS求条(调出必关)
P1825[USACO11OPEN] Corn Maze S参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mjv8gv64
- 此快照首次捕获于
- 2026/01/01 17:19 2 个月前
- 此快照最后确认于
- 2026/01/03 21:40 2 个月前
RT
CPP#include<bits/stdc++.h>
using namespace std;
const int N=300*300*2+5;
int d[N],idx,to[N],w[N],ne[N],h[N];
bool st[N];
char tp[305][305];
struct node
{
int x1,x2;
int y1,y2;
};
unordered_map<char,node> hsh;
bool jud[305][305];
int n,m;
void add(int u,int v,int we)
{
to[idx]=v;
w[idx]=we;
ne[idx]=h[u];
h[u]=idx++;
}
void spfa(int u)
{
queue<int>q;
d[u]=0;
q.push(u);
st[u]=1;
while(q.size())
{
int k=q.front();
q.pop();
st[k]=0;
for(int i=h[k];i!=-1;i=ne[i])
{
int j=to[i];
if(d[j]>d[k]+w[i])
{
d[j]=d[k]+w[i];
if(!st[j])
{
q.push(j);
st[j]=1;
}
}
}
}
}
int bxh(int x,int y)
{
return (x-1)*m+y;
}
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int main()
{
memset(h,-1,sizeof h);
memset(d,0x3f,sizeof d);
cin>>n>>m;
int ed=0,str=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>tp[i][j];
if(tp[i][j]!='.'&&tp[i][j]!='#'&&tp[i][j]!='='&&tp[i][j]!='@')
{
jud[i][j]=1;
if(!hsh[tp[i][j]].x1)
{
hsh[tp[i][j]].x1=i;
hsh[tp[i][j]].y1=j;
}
else
{
add(bxh(hsh[tp[i][j]].x1,hsh[tp[i][j]].y1),bxh(i,j),0);
add(bxh(i,j),bxh(hsh[tp[i][j]].x1,hsh[tp[i][j]].y1),0);
jud[i][j]=1;
jud[hsh[tp[i][j]].x1][hsh[tp[i][j]].y1]=1;
}
}
if(tp[i][j]=='=')
ed=bxh(i,j);
if(tp[i][j]=='@')
str=bxh(i,j);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!jud[i][j]&&tp[i][j]!='#')
{
for(int k=0;k<4;k++)
{
int tx=i+dx[k];
int ty=j+dy[k];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&tp[tx][ty]!='#')
{
add(bxh(i,j),bxh(tx,ty),1);
add(bxh(tx,ty),bxh(i,j),1);
}
}
}
}
}
spfa(str);
cout<<d[ed];
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...