社区讨论
spfa求调 玄关
P1825[USACO11OPEN] Corn Maze S参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lw3adhde
- 此快照首次捕获于
- 2024/05/12 16:41 2 年前
- 此快照最后确认于
- 2024/05/12 19:15 2 年前
spfa+拆点,不知道为啥就是过不了,我下载了样例手数了一遍发现我的程序好像是对的??
CPP#include<bits/stdc++.h>
using namespace std;
int n,m,S,T;
struct Edge{
int v,w;
};
vector<Edge> g[100005];
char s[305][305];
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,1,-1};
int t[1145];
int id(int i,int j){
return (i-1)*m+j;
}
int dis[100005];
bool f[100005];
void spfa(int st){
memset(dis,0x3f,sizeof(dis));
memset(f,0,sizeof(f));
dis[st]=0;
queue<int> q;
q.push(st);
while(!q.empty()){
int x=q.front();
q.pop();
f[x]=0;
for(auto [y,w]:g[x]){
if(dis[y]>dis[x]+w){
dis[y]=dis[x]+w;
if(!f[y]){
f[y]=1;
q.push(y);
}
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i][j]=='#'){
continue;
}
for(int k=1;k<=4;k++){
int xx=i+dx[k],yy=j+dy[k];
if(xx<1||xx>n||yy<1||yy>m||s[xx][yy]=='#'){
continue;
}
g[id(i,j)].push_back({id(xx,yy),1});
g[id(xx,yy)].push_back({id(i,j),1});
}
if(s[i][j]=='@'){
S=id(i,j);
}
if(s[i][j]=='='){
T=id(i,j);
}
if(s[i][j]>='A'&&s[i][j]<='Z'){
if(t[s[i][j]]){
g[t[s[i][j]]].push_back({id(i,j),0});
g[id(i,j)].push_back({t[s[i][j]],0});
}
t[s[i][j]]=id(i,j);
}
}
}
spfa(S);
printf("%d",dis[id(4,28)]);
// printf("%d",dis[T]);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...