关于这题的重边
查看原帖
关于这题的重边
222578
jingkongwanglimiaoa楼主2021/1/25 22:22

原来最短路的模板改了改后的spfa水过了该题

然鹅一看讨论区发现有重边

再一看自己的程序,没有判重边的部分

难道是spfa具有重边免疫力吗

祝愿我比赛的时候也有这样的免疫力

言归正传,原理是什么a

# include <cstdio>
# include <cstring>
# include <queue>
using namespace std;
int n,p,a,b,c,lk[66666],vis[66666],dis[66666],hp;
queue < int > q;
struct sth{
	int p,o,w;
}e[166666];
void add(int u,int v,int t)
{
	e[++hp] = {v,lk[u],t};
	lk[u] = hp;
}
void spfa()
{
	vis[1] = 1,q.push(1),dis[1] = 0;
	while (!q.empty())
	{
		int x = q.front();q.pop();vis[x] = 0;
		for (int i = lk[x];i;i = e[i].o)
		{
			if (dis[x] + e[i].w < dis[e[i].p])
			{
				dis[e[i].p] = dis[x] + e[i].w;
				if (!vis[e[i].p]) q.push(e[i].p),vis[e[i].p] = 1; 
			}
		}
	}
}
int main()
{
	memset(dis,0x3f,sizeof(dis));
	scanf("%d %d",&n,&p);
	for (int i = 1;i <= p;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		add(a,b,-c);
	}
	spfa();
	if (dis[n] == 0x3f3f3f3f) printf("-1");
	else printf("%d",-dis[n]);
}
2021/1/25 22:22
加载中...