用了SPFA求最长路,wa#3, 90分。同时样例也没过,输出-1!我看用链式前向星的就没有这个问题,为什么?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+4;
int n,k;
struct node{
int v;
long long w;
};
vector<node> g[N];
ll d[N],cnt[N];
bool vis[N];
bool spfa(){
for(int i=1;i<=n+1;i++)
d[i]=0x3f3f3f3f;
d[0]=0;
cnt[0]=0;
queue<int> q;
q.push(0);
vis[0]=1;
while(q.size()){
int x=q.front();q.pop();
vis[x]=0;
for(auto y:g[x]){
int v=y.v;
int w=y.w;
cnt[v]=cnt[x]+1;
if(cnt[v]>n) return false;
if(d[v]>d[x]+w){
d[v]=d[x]+w;
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
return true;
}
int main(){
//本题要求求最小可行解,应该求最长路 xj-xi>=w ,i->j建边
//求最长路,边权取反后求最短路。
cin>>n>>k;
int x,a,b;
for(int i=1;i<=k;i++){
cin>>x>>a>>b;
if(x==1){
g[a].push_back({b,0});
g[b].push_back({a,0});
}
else if(x==2){ //xa+1<=xb
g[a].push_back({b,-1});
}
else if(x==3){ //xa>=xb+0
g[b].push_back({a,0});
}
else if(x==4){ //xa>=xb+1
g[b].push_back({a,-1});
}
else{ //xa<=xb+0
g[a].push_back({b,0});
}
}
for(int i=1;i<=n;i++)
g[0].push_back({i,1});
if(spfa()){
ll mind=1e9,ans=0;
for(int i=1;i<=n;i++){
mind=min(mind,-d[i]);
ans+=-d[i];
// cout<<d[i]<<endl;
}
if(mind<=0){
ans+=(-mind+1)*n;
}
cout<<ans;
}
else
cout<<"-1";
}