題目來源
洛谷P1339[USACO09OCT]熱浪Heat Wave
https://www.luogu.org/problem/show?pid=1339
洛谷P2951[USACO09OPEN]捉迷藏Hide and Seek
https://daniu.luogu.org/problemnew/show/P2951
洛谷P1346電車
https://www.luogu.org/problemnew/show/P1346
思路
SPFA模板題
代碼(C++)[熱浪Heat Wave]
#include <cstdio>
#include <queue>
#include <bitset>
using namespace std;
bitset<3000> in; queue<int> q;
int n,m,s,t,u,v,w,cnt=0,pos,k;
int he[3000],en[12500],ne[12500],len[12500];
long long dis[3000];
inline void add();
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;++i)
scanf("%d%d%d",&u,&v,&w),add();
for(int i=1;i<=n;++i)
dis[i]=9223372036854775807;
dis[s]=0; in[s]=1; q.push(s);
while(!q.empty())
{
pos=q.front(); q.pop(); in[pos]=0;
k=he[pos];
while(k!=0)
{
if(dis[pos]+len[k]<dis[en[k]])
{
dis[en[k]]=dis[pos]+len[k];
if(in[en[k]]==0)
q.push(en[k]);
in[en[k]]=1;
}
k=ne[k];
}
}
printf("%lld",dis[t]);
return 0;
}
inline void add()
{
en[++cnt]=v; len[cnt]=w;
ne[cnt]=he[u]; he[u]=cnt;
en[++cnt]=u; len[cnt]=w;
ne[cnt]=he[v]; he[v]=cnt;
}
代碼(C++)[捉迷藏Hide and Seek]
#include <cstdio>
#include <queue>
#include <bitset>
#define N 20010
#define M 100010
using namespace std;
bitset<N> in; queue<int> q;
int n,m,s,t,u,v,w,cnt=0,pos,k;
int he[N],en[M],ne[M],len[M],a1,a2,a3;
long long dis[N];
inline void add();
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
scanf("%d%d",&u,&v),w=1,add();
for(int i=2;i<=n;++i)
dis[i]=9223372036854775807;
in[1]=1; q.push(1);
while(!q.empty())
{
pos=q.front(); q.pop(); in[pos]=0;
k=he[pos];
while(k!=0)
{
if(dis[pos]+len[k]<dis[en[k]])
{
dis[en[k]]=dis[pos]+len[k];
if(in[en[k]]==0)
q.push(en[k]);
in[en[k]]=1;
}
k=ne[k];
}
}
for(int i=1;i<=n;++i)
{
if(dis[i]>a2)
a2=dis[i],a1=i,a3=1;
else if(dis[i]==a2)
++a3;
}
printf("%d %d %d",a1,a2,a3);
return 0;
}
inline void add()
{
en[++cnt]=v; len[cnt]=w;
ne[cnt]=he[u]; he[u]=cnt;
en[++cnt]=u; len[cnt]=w;
ne[cnt]=he[v]; he[v]=cnt;
}
代碼(C++)[電車]
#include <cstdio>
#include <queue>
#include <bitset>
using namespace std;
bitset<110> in; queue<int> q;
int n,x,s,t,u,v,w,cnt=0,pos,dis[110];
int he[110],en[20010],ne[20010],len[20010];
inline void add();
int main()
{
scanf("%d%d%d",&n,&s,&t);
for(int i=1;i<=n;++i)
{
scanf("%d",&x); u=i;
if(x!=0)
scanf("%d",&v),w=0,add();
for(int j=2;j<=x;++j)
scanf("%d",&v),w=1,add();
dis[i]=2147483647;
}
dis[s]=0; in[s]=1; q.push(s);
while(!q.empty())
{
pos=q.front(); q.pop(); in[pos]=0;
for(int k=he[pos];k!=0;k=ne[k])
if(dis[pos]+len[k]<dis[en[k]])
{
dis[en[k]]=dis[pos]+len[k];
if(in[en[k]]==0)
q.push(en[k]),in[en[k]]=1;
}
}
if(dis[t]==2147483647)
printf("-1");
else
printf("%d",dis[t]);
return 0;
}
inline void add()
{
en[++cnt]=v; len[cnt]=w;
ne[cnt]=he[u]; he[u]=cnt;
}