您的位置:首页 > 其它

SPFA——热浪Heat Wave、捉迷藏Hide and Seek、电车

2017-10-13 21:48 246 查看

题目来源

洛谷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
,en[M],ne[M],len[M],a1,a2,a3;
long long dis
;
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,&
4000
amp;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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SPFA