题目背景
我是源点,你是终点。我们之间有负权环。 ——小明
题目描述
在小明和小红的生活中,有 N 个关键的节点。有 M 个事件,记为一个三元组 (Si,Ti,Wi),表示从节点 Si 有一个事件可以转移到 Ti,事件的效果就是使他们之间的距离减少 Wi。
这些节点构成了一个网络,其中节点 11 和 N 是特殊的,节点 11 代表小明,节点 N 代表小红,其他代表进展的阶段。所有事件可以自由选择是否进行,但每次只能进行当前节点邻接的。请你帮他们写一个程序,计算出他们之间可能的最短距离。
输入格式
第一行,两个正整数 N,M。
之后 M 行,每行 33 个空格隔开的整数 Si,Ti,Wi。
输出格式
一行,一个整数表示他们之间可能的最短距离。如果这个距离可以无限缩小,输出Forever love
。
输入输出样例
输入 #1复制
3 3 1 2 3 2 3 -1 3 1 -10
输出 #1复制
-2
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+10;
int n,m;
int suc = 1;
int dis[N],vis[N],cnt[N];
vector<pair<int,int> > e[N];
int spfa(int A)
{
for(int i=1;i<=n;i++)
{
dis[i] = 1e18;
vis[i] = 0;
cnt[i] = 0;
}
queue<int > q;
q.push(A);
dis[A] = 0;
vis[A] = 1;
while(q.size())
{
int now = q.front();
q.pop();vis[now] = 0;
for(auto t:e[now])
{
int spot = t.first,w = t.second;
if(dis[spot]>dis[now]-w)
{
dis[spot] = dis[now]-w;
cnt[spot] = cnt[now]+1;
if(cnt[spot]>=n)
{
suc = 0;
return false;
}
if(vis[spot]==0)
{
vis[spot] = 1;
q.push(spot);
}
}
}
}
return true;
}
signed main()
{
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
e[a].push_back({b,c});
}
spfa(1);
int a = dis[n];
spfa(n);
int b = dis[1];
if(suc==0) cout<<"Forever love";
else cout<<min(a,b);
return 0;
}