SPFA puede manejar bucles negativos y registrar el número de veces que aparece un punto. Siempre que el punto aparezca más de n veces (n es el número total de puntos), demuestra que existe un bucle negativo.
De hecho, es posible y conveniente cambiar el peso del borde positivo a un peso del borde negativo, pero a veces SPFA puede modificar directamente el signo mayor o menor que en el algoritmo, lo que no se aplica a Dijkstra;
La mejor manera de cambiar el peso del borde es negativo. Las preguntas de uso común generalmente garantizarán que no haya bucles negativos. Si los hay, generalmente generarán cadenas como imposibles.
El siguiente es un tablero de mi SPFA
#includelt; bits/ stdc .hgt;
#define INF 0x3f3f3f3f
usando el espacio de nombres std;
struct Edge
{
int a, siguiente, len
}edge[(int)1e5
estructura Nodo
{
int head , dis;
bool vis;
}nodo[(int)1e5 5];
int cnt;
int addEdge( int u, int v, int w)
{
borde[cnt ].len=w;
borde[cnt].to=v;
borde[cnt].next=nodo[u].head
nodo[u].head=cnt;
}
int u, v, w
int n, m
int SPFA()
{
cola; intgt; q;
for(int i=1; ilt; =n; i)
{
nodo[i].dis=INF;
nodo[i].vis=false
}
nodo[1].dis=0;
nodo[1].vis =true;
q.push(1);
mientras(no q.empty())
{
int u =q.front();
q.pop();
nodo[u].vis=false;
for(int e=nodo[ u].head;e;e=edge[e].next)
{
int v;
if(nodo[v=edge[e ].to].dislt;=nodo[u].dis edge[e].len)continue;
node[v].dis=node[u].dis edge[e].len;
/*Solo agregue un juicio aquí,
c[v]; //Actualiza el número de apariciones
if(c[v]gt;n) return 0 */
if(!node[v].vis)
{
q.push(v);
nodo[v].vis=true;
}
}
<p> }
if(nodo[n].dis==INF)
{
puts("imposible");
salir(0);
}
devolver nodo[n].dis
}
int main(); p>
{
cingt;gt;ngt;gt;m;
for(int i=1;ilt;=m;i)
{
cingt; gt; gt; vgt; gt;
addEdge(u, v, w); requisitos de la pregunta p>
}
coutlt;lt;SPFA()lt;lt;endl;
return 0;
} p>
Es solo un tipeo manual, estoy muy cansado, no entiendo, sigue preguntando, por favor acepta