额,大一暑假写的最短路 Spfa 检测负环模板,还是比较干净的,翻出来存起来以后备用。
用SPFA做了两道题
POJ2253、1797
分别是 求 可达路径中,最大边的最小可以为多少。
解:中转点与边取最大,与目的点取小。
s点为0,dis其余初始INF无碍
以及 求 可达路径中,最小边的最大可以为多少。
解:中转点与边取最小,与目的点取大。
s点为INF,dis其余也初始INF
#define INF 99999999
#define inf 1009
#define loop(x,y,z) for(x=y;x<z;x++)
#define ll long long
int n,m;
int book[inf],s,g; //别忘了s和g的赋值
double dis[inf];
int e[inf][inf];
queue<int>q;
struct node
{
int to;
int w;
node(int i,double j)
{
to=i;
w=j;
}
};
vector<node>edge[inf];
void init()
{
int i;
loop(i,0,n)
edge[i].clear();
memset(book,0,sizeof book);
loop(i,0,n)
dis[i]=INF;
dis[s]=0;
while(!q.empty())q.pop();
}
void Spfa()
{
int i;
q.push(s);
book[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
book[u]=0;
int len=edge[u].size();
loop(i,0,len)
{
node& e=edge[u][i];
if(dis[e.to]>dis[u]+e.w)
{
dis[e.to]=dis[u]+e.w;
if(!book[e.to])
{
q.push(e.to);
book[e.to]=1;
}
}
}
}
}