要求你求出从1点到n点所需要住最少的宾馆数,用SPFA先求出宾馆到各点的最短距离,然后进行BFS搜索~
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int maxn=10001;
const int inf=1<<30;
int e,n,h,m,head[maxn],pnt[2*maxn*10],dist[maxn],nxt[2*maxn*10],cost[2*maxn*10];
int g[105][105],ans[105];
vector<int> hotel;
bool vis[maxn];
int q[maxn*2];
void addedge(int u,int v,int c)
{
pnt[e]=u;nxt[e]=head[v];cost[e]=c;head[v]=e++;
}
void Spfa(int s)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++)
dist[i]=inf;
dist[hotel[s]]=0;
vis[hotel[s]]=1;
int pre=0,last=1;
q[0]=hotel[s];
while(pre<last)
{
int u=q[pre++];
vis[u]=0;
for(int i=head[u];i!=-1;i=nxt[i])
{
int v=pnt[i];
if(dist[v]>dist[u]+cost[i])
{
dist[v]=dist[u]+cost[i];
if(!vis[v])
{
q[last++]=v;
vis[v]=1;
}
}
}
}
for(int i=0;i<hotel.size();i++)
if(dist[hotel[i]]<=600)
g[s][i]=g[i][s]=1;
}
void BFS()
{
for(int i=0;i<=104;i++)
ans[i]=inf;
ans[0]=0;
int pre=0,last=1;
q[0]=0;
while(pre<last)
{
int u=q[pre];
pre++;
for(int i=0;i<=h;i++)
{
if(ans[i]>ans[u]+g[u][i])
{
ans[i]=ans[u]+g[u][i];
q[last++]=i;
}
}
}
if(ans[1]==inf)
printf("-1\n");
else
printf("%d\n",ans[1]-1);
}
int main()
{
while(scanf("%d",&n)&&n)
{
memset(head,-1,sizeof(head));
hotel.clear();
e=0;
hotel.push_back(1);
hotel.push_back(n);
scanf("%d",&h);
int cou=0;
for(int i=0;i<h;i++)
{
int ita;
scanf("%d",&ita);
if(ita==1||ita==n)
{
cou++;
continue;
}
hotel.push_back(ita);
}
h+=1;
h-=cou;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
addedge(u,v,c);
addedge(v,u,c);
}
for(int i=0;i<=h;i++)
{
for(int j=0;j<=h;j++)
g[i][j]=inf;
g[i][i]=0;
}
for(int i=0;i<hotel.size();i++)
Spfa(i);
BFS();
}
return 0;
}

本文介绍了一种使用SPFA算法求出宾馆到各点的最短距离,然后通过BFS搜索从1点到n点所需最少宾馆数量的方法。

522

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



