用的是spfa跑差分约束,然后出了#6 TLE,其他的运行效率都十分可观,求助QAQ
#include<bits/stdc++.h>
#define F(i,l,r) for(register int i=l;i<=r;i++)
#define D(i,r,l) for(register int i=r;i>=l;i--)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define p_b push_back
#define m_p make_pair
#define il inline
#define fi first
#define se second
const int INF=0x7f7f7f7f,N=1e5+5;
using namespace std;
void rd(int &num) {
char ch=getchar();
num=0;
int k=1;
while((ch>'9'||ch<'0')&&ch!='-') ch=getchar();
if(ch=='-') k=-1,ch=getchar();
while(ch<='9'&&ch>='0') num=num*10+ch-'0',ch=getchar();
num*=k;
}
int n,k;
int op,u,v,w;
int head[N];
struct node {
int to,nxt,w;
}e[(N<<2)+N];
int ecnt;
void add(int u,int v,int w) {
e[++ecnt].to=v;
e[ecnt].nxt=head[u];
e[ecnt].w=w;
head[u]=ecnt;
}
bool in[N];
int dis[N],cnt[N];
int spfa(int x) {
queue<int> q;
q.push(x);in[x]=1;
dis[x]=0;
while(!q.empty()) {
int u=q.front();q.pop();
in[u]=0;
for(int i=head[u];~i;i=e[i].nxt) {
int to=e[i].to,w=e[i].w;
if(dis[to]<dis[u]+w) {
dis[to]=dis[u]+w;
if(!in[to]) {
in[to]=1;
q.push(to);
cnt[to]++;
if(cnt[to]==n) return false;
}
}
}
}
return 1;
}
int main() {
mem(head,-1);
rd(n),rd(k);
F(i,1,k) {
rd(op),rd(u),rd(v);
if(op%2==0&&u==v) return puts("-1"),0;
if(op==1) add(u,v,0),add(v,u,0);
if(op==2) add(u,v,1);
if(op==3) add(v,u,0);
if(op==4) add(v,u,1);
if(op==5) add(u,v,0);
}
F(i,1,n) add(0,i,1);
if(!spfa(0)) return puts("-1"),0;
ll ans=0;
F(i,1,n) ans+=dis[i];
printf("%lld\n",ans);
return 0;
}