求助,T了12个点
查看原帖
求助,T了12个点
320470
William_Takazaki楼主2023/8/17 11:05

我觉得差分约束没问题啊,而且是SPFA求最长路

离谱的是,T了一些居然还是100分

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll pre[N],k,d[N],cnt[N],n,m;
bool f[N];
stack<int> st;
struct point{
	ll to,next,len;
}a[N*3];
void add(ll u,ll v,ll len){
	k++;
	a[k].to=v;
	a[k].next=pre[u];
	a[k].len=len;
	pre[u]=k;
}ll spfa(){
	ll i,ans=0;
	memset(d,-0x3f,sizeof(d));
	d[0]=0;
	st.push(0);
	while(!st.empty()){
		ll h=st.top();
		st.pop();
		f[h]=false;
		for(i=pre[h];i!=0;i=a[i].next){
			ll to=a[i].to;
			if(d[h]+a[i].len>d[to]){
				d[to]=d[h]+a[i].len;
				cnt[to]=cnt[h]+1;
				if(cnt[to]==n+1)return -1;
				if(f[to]==false){
					f[to]=true;
					st.push(to);
				}
			}
		}
	}for(i=1;i<=n;i++)ans+=d[i];
	return ans;
}int main(){
	ll op,x,y,i;
	scanf("%lld%lld",&n,&m);
	while(m--){
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op==1)add(x,y,0),add(y,x,0);
		else if(op==2)add(x,y,1);
		else if(op==3)add(y,x,0);
		else if(op==4)add(y,x,1);
		else if(op==5)add(x,y,0);
	}for(i=1;i<=n;i++)add(0,i,1);
	printf("%lld",spfa());
	return 0;
}

2023/8/17 11:05
加载中...