队列:spfa
出队flag置为0,入队的时候置为1,和朴素算法一样
#include<bits/stdc++.h>
#define x first
#define y second
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int,int> PII;
const int N = 25005;
int n,m,s,d,r,p,dis[N],in[N];
vector<PII> mar[N];
bool vis[N];
bool spfa(int s)
{
memset(dis,-INF,sizeof(dis));
queue<int>qu;
qu.push(s);
dis[s]=0;
while(qu.size())
{
int u=qu.front();
qu.pop();
vis[u]=0;
for(int i=0;i<mar[u].size();i++)
{
int v=mar[u][i].x;
int w=mar[u][i].y;
if(dis[v]<dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v])
{
vis[v]=1;
qu.push(v);
if(++in[v]>n-1)
return true;
}
}
}
}
return false;
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
mar[u-1].push_back({v,w});
mar[v].push_back({u-1,-w});
}
if(spfa(0))
cout<<"x"<<endl;
else
{
for(int i=1;i<=n;i++)
{
if(i!=1)
cout<<" ";
if(abs(dis[i])>=1e9||abs(dis[i]-dis[i-1])>=1e9)
cout<<"o";
else
cout<<dis[i]-dis[i-1];
}
}
return 0;
}
如果使用优先队列,则入队时候判断flag,如果为1,则continue,否则置为1
但是不能判断有无负权环
优先队列:top
队列:front
本文探讨了在路径搜索算法中,优先队列与普通队列的区别。通过设置出队和入队标志位,优先队列在处理过程中可以跳过已处理节点,但无法检测负权环;而普通队列则按照先进先出原则进行操作。

392

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



