wxwoo's blog

原题目链接

此题显然为有向图判负权环板子题

没做过请先右转模板【负环】

此题关键点:

小明和小红的生活中,有N个关键的节点。有M个事件,记为一个三元组(Si,Ti,Wi),表示从节点Si有一个事件可以转移到Ti,事件的效果就是使他们之间的距离减少Wi。

所以建边时,要把权值变为相反数

然后以1为源点进行SPFA求负环,就AC了

……吗?

交上去一看,WA90!

此题最大关键点:

题目中没有说明是“小明向小红‘拉近距离’”还是“小红向小明‘拉近距离’”!

题目背景是小明说的,不代表小红观点,所以不算

所以我们还需要以n为源点进行SPFA求负环

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
template<typename T>inline void read(T &x)
{
int ch=getchar();
T f=1;
x=0;
while(!('0'<=ch&&ch<='9'))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-48;
ch=getchar();
}
x*=f;
}
const int N=1e4+10;
int n,m;
int head[N],to[(N*10)<<1],nxt[(N*10)<<1],w[(N*10)<<1],e;
int ans[N],cnt[N];
bool vis[N];
queue<int>q;
inline void add(const int &u,const int &v,const int &c)
{
to[++e]=v;
w[e]=c;
nxt[e]=head[u];
head[u]=e;
}
inline bool spfa(const int &s)
{
while(!q.empty())
q.pop();
memset(ans,0x3f,sizeof(ans));
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
ans[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(ans[y]>ans[x]+w[i])
{
ans[y]=ans[x]+w[i];
cnt[y]=cnt[x]+1;
if(cnt[y]>n)
return 1;
if(!vis[y])
{
vis[y]=1;
q.push(y);
}
}
}
}
return 0;
}
int main()
{
read(n);
read(m);
int u,v,w;
for(int i=1;i<=m;++i)
{
read(u);
read(v);
read(w);
add(u,v,-w);
}
if(spfa(1))
{
printf("Forever love");
return 0;
}
int res=ans[n];
if(spfa(n))
printf("Forever love");
else
printf("%d",min(res,ans[1]));
return 0;
}

 评论

载入天数...载入时分秒...


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 , 总访问量为 次 。