这个题 刚开始用了2次spfaWA了 查了下题解发现是网络流的问题 但有人用spfa过了
一直不明白原理 为什么改成负边可以AC 改成INF不能过 求出来的最短路不应该是一样的吗?
求大神指点。
#include<cstdio>
#include<cstring>#define maxn 210
#define maxe 1010
#define INF 1<<30
int n,m,edge[maxn][maxn],dist[maxn];
int queue[maxe],path[maxn];
bool vis[maxn];
void init(int s)
{
for(int i = 1; i <= n; i++)
dist[i] = INF;
dist[s] = 0;
memset(vis,0,sizeof(vis));
}
int spfa(int s)
{
init(s);
int head = 0,tail = 1;
queue[0] = s;
dist[s] = 0;
while(head < tail)
{
int u = queue[head];
vis[u] = true;
for(int i = 1; i <= n; i++)
{
if(dist[i]>dist[u]+edge[u][i])
{
dist[i]=dist[u]+edge[u][i];
path[i]=u;
if(!vis[i])
{
vis[i] = true;
queue[tail] = i;
tail++;
}
}
}
vis[u] = false;
head++;
}
}
int main()
{
int f,to,di;
while(scanf("%d",&n)==1)
{
if(!n) break;
scanf("%d",&m);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i==j) continue;
edge[i][j] = INF;
}
}
for(int i = 0; i < m; i++)
{
scanf("%d %d %d",&f,&to,&di);
edge[f][to] = edge[to][f] = di;
}
spfa(1);
int x = dist[n];
int s = n;
if(x>=INF)
{
printf("Back to jail\n");
continue;
}
while(s!=1)
{
edge[s][path[s]] = INF;//-edge[s][path[s]];
edge[path[s]][s] = INF;
s = path[s];
}
memset(vis,0,sizeof(vis));
spfa(1);
int y = dist[n];
if(x>=INF||y>=INF)
printf("Back to jail\n");
else
printf("%d\n",x+y);
}
return 0;
}
本文探讨了SPFA算法在解决网络流问题时的适用性及与其他算法的区别,通过实例解析了SPFA如何在特定条件下实现问题求解,并解释了负边与无穷大边在算法应用中的差异。
118

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



