为什么vector邻接表样例都没过?输出-1
查看原帖
为什么vector邻接表样例都没过?输出-1
115738
ciao_1楼主2024/5/5 23:16

用了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";
}
2024/5/5 23:16
加载中...