#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define x first
#define y second
typedef pair<int,int> PII;
const int N=1e5+10,M=3e5+10,MOD=1e9+7;
ll n,m,k,ans,ecnt;
int head[N],d[N],vis[N],cnt[N];
struct edge {
int u,v,w,next;
} E[M];
void add(int u,int v,int w) {
E[++ecnt].u=u;
E[ecnt].v=v;
E[ecnt].w=w;
E[ecnt].next=head[u];
head[u]=ecnt;
}
bool spfa() {
stack<int> q;
q.push(0);
vis[0]=1;
memset(d,-INF,sizeof d);
d[0]=0;
while(!q.empty()) {
int u=q.top();
q.pop();
vis[u]=0;
for(int i=head[u]; i; i=E[i].next) {
int v=E[i].v;
if(d[v]<d[u]+E[i].w) {
d[v]=d[u]+E[i].w;
cnt[v]=cnt[u]+1;
if(cnt[v]>=n+1)return false;//有正环,无解
if(!vis[v]) {
vis[v]=1;
q.push(v);
}
}
}
}
return true;
}
int main() {
cin>>n>>m;
while(m--) {
int u,v,w;
cin>>w>>u>>v;
if(w==1) {
add(u,v,0);
add(v,u,0);
} else if(w==2) {
add(u,v,1);
} else if(w==3) {
add(v,u,0);
} else if(w==4) {
add(v,u,1);
} else {
add(u,v,0);
}
}
for(int i=1; i<=n; i++)add(0,i,1);
if(!spfa())puts("-1");
else {
ll res=0;
for(int i=1; i<=n; i++) res+=d[i];
cout<<res<<endl;
}
return 0;
}
差分约束(spfa)
最新推荐文章于 2024-07-15 11:08:21 发布