我觉得差分约束没问题啊,而且是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;
}