社区讨论
关于差分之后做法
P1993小 K 的农场参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi7cphpj
- 此快照首次捕获于
- 2025/11/20 19:31 4 个月前
- 此快照最后确认于
- 2025/11/20 19:31 4 个月前
首先差分建边
这题正解是跑最长路同时dfs判环(或最短路)
SPFA会很慢,但为什么WA?
#60分代码
CPP#include<iostream>
#include<queue>
using namespace std;
int n,m,S,num,visit[10005],dis[10005],tm[10005],head[100005];
struct note {
int to,next,cost;
} a[100005];
void add(int x,int y,int z) {
num++;
a[num].to=y;
a[num].cost=z;
a[num].next=head[x];
head[x]=num;
}
bool spfa() {
queue <int > q;
q.push(S);
for(int i=1; i<=n; i++) {
dis[i]=-1;
}
dis[S]=0;
visit[0]=1;
while(!q.empty()) {
int t=q.front();
q.pop();
for(int i=head[t]; i; i=a[i].next) {
int v=a[i].to;
if(dis[v]<dis[t]+a[i].cost) {
dis[v]=dis[t]+a[i].cost;
tm[v]++;
if(tm[v]==n) {
return 0;
}
if(!visit[v]) {
visit[v]=1;
q.push(v);
}
}
}
}
return 1;
}
int main() {
cin>>n>>m;
S=0;
for(int i=1; i<=n; i++) {
add(0,i,0);
}
int t,x,y,z;
for(int i=1; i<=m; i++) {
cin>>t;
if(t==1) {
cin>>x>>y>>z;
add(y,x,z);
}
if(t==2) {
cin>>x>>y>>z;
add(x,y,-z);
}
if(t==3) {
cin>>x>>y;
add(x,y,0);
add(y,x,0);
}
}
if(spfa()) {
cout<<"Yes";
} else cout<<"No";
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...