差分约束系统。
特殊数据害人不浅。。。。。。。。
Spfa可能TLE,最好用Dijkstra。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct Edge{int to,next,v;}e[400005]; int head[100005],d[100005],cnt[100005],edge,n,k; bool inq[100005]; void ins(int u,int v,int w){ edge++; e[edge].to=v;e[edge].next=head[u];e[edge].v=w;head[u]=edge; } bool spfa(int s){ queue<int>q;q.push(s);inq[s]=true; cnt[s]=1; while(!q.empty()){ int u=q.front();q.pop(); inq[u]=false; for(int i=head[u];i;i=e[i].next) if(d[e[i].to]<d[u]+e[i].v){ d[e[i].to]=d[u]+e[i].v; if(++cnt[e[i].to]>=n)return true; if(!inq[e[i].to]){ inq[e[i].to]=true;q.push(e[i].to); } } } return false; } bool init(){ scanf("%d%d",&n,&k);int x,a,b; for(int i=1;i<=k;i++){ scanf("%d%d%d",&x,&a,&b); switch(x){ case 1:ins(a,b,0);ins(b,a,0);break; case 2:if(a==b)return false;ins(a,b,1);break; case 3:ins(b,a,0);break; case 4:if(a==b)return false;ins(b,a,1);break; case 5:ins(a,b,0);break; } } return true; } int main(){ if(!init()){ printf("-1"); return 0; } int S=n+1; for(int i=n;i>=1;i--) ins(S,i,1); if(spfa(S)){ printf("-1"); return 0; } long long ans=0; for(int i=1;i<=n;i++) ans+=d[i]; printf("%lld",ans); return 0; }