做过一个类似的,求最短路径有点纠结。
ACcode:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int const NS=210;
int const MS=14;
int const INF=(1<<30);
struct Node
{
int x,y,v;
bool operator<(const Node cmp) const{
return v>cmp.v;
}
};
priority_queue<Node> qu;
struct Point
{
int x,y;
} p[MS];
int n,m,k;
int dist[MS][MS];
int vis[MS],dp[1<<13][MS];
int v[NS][NS],g[NS][NS];
int dx[4]= {0,0,-1,1};
int dy[4]= {-1,1,0,0};
bool judgevis()
{
for (int i=0; i<=k; i++)
if (!vis[i]) return false;
return true;
}
bool bianjie(Node cur)
{
if (cur.x<0||cur.y<0||cur.x>=n||cur.y>=m)
return true;
return false;
}
void bfs(int pos)
{
Node cur,next;
memset(v,0,sizeof(v));
memset(vis,0,sizeof(vis));
vis[pos]=1;
cur.x=p[pos].x,cur.y=p[pos].y;
cur.v=g[cur.x][cur.y];
v[cur.x][cur.y]=1;
priority_queue<Node> qu;
qu.push(cur);
while (!qu.empty())
{
cur=qu.top(),qu.pop();
for (int i=0; i<4; i++)
{
next.v=cur.v;
next.x=cur.x+dx[i];
next.y=cur.y+dy[i];
if (bianjie(next))
{
if(!vis[k])
vis[k]=1,dist[k][pos]=cur.v;
if (judgevis()) return ;
}
else
{
if (v[next.x][next.y]||g[next.x][next.y]==-1) continue;
v[next.x][next.y]=1;
for (int j=0; j<k; j++)
if (next.x==p[j].x&&next.y==p[j].y)
{
if (!vis[j])
vis[j]=1,dist[j][pos]=cur.v;
if (judgevis()) return ;
}
next.v+=g[next.x][next.y];
qu.push(next);
}
}
}
}
int Min(int a1,int b1)
{
return a1<b1?a1:b1;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
scanf("%d",&g[i][j]);
scanf("%d",&k);
for (int i=0; i<k; i++)
scanf("%d%d",&p[i].x,&p[i].y);
int s,t,lim=1<<k;
for (int i=0; i<k; i++)
{
bfs(i);
dist[i][i]=0;
dp[1<<i][i]=dist[k][i];
dist[i][k]=dist[k][i]-g[p[i].x][p[i].y];
}
for (int i=3; i<lim; i++)
{
if ((i&(i-1))==0) continue;
for (int j=0; j<k; j++)
if (i&(1<<j))
{
s=INF,t=i-(1<<j);
for (int c=0; c<k; c++)
if (t&(1<<c))
s=Min(s,dp[t][c]+dist[c][j]);
dp[i][j]=s;
}
}
s=INF;
for (int i=0; i<k; i++)
s=Min(s,dp[lim-1][i]+dist[i][k]);
if (s>=INF) s=0;
printf("%d\n",s);
}
return 0;
}
本文介绍了一个使用优先队列实现的最短路径算法案例,通过遍历地图网格寻找从指定起点到所有兴趣点的最短路径,并最终找到返回基地的最短路径。该算法适用于解决特定场景下的路径规划问题。
1196

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



