超级源点的边要建成1。
一定要跑最长路啊啊啊 最后输出的是累加 还有e数组一定要足够大QwQ 还有这个2和4的特判#include#include #include #include using namespace std;int n,k,hh[100005],dis[100006],vis[100005],head[100005],cnt;struct edge{ int v,w,next;}e[5000005];inline void add(int u,int v,int w){ e[++cnt].v=v; e[cnt].w=w; e[cnt].next=head[u]; head[u]=cnt;}inline void spfa(){ queue q; q.push(0); dis[0]=0; vis[0]=1; while(!q.empty()){ int u=q.front(); vis[u]=0; q.pop(); for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].v; if(dis[v] n){ printf("-1\n"); exit(0); } } } } }}int main (){ memset(dis,-0x3f,sizeof(dis)); memset(head,-1,sizeof(head)); scanf("%d%d",&n,&k); for(int i=n;i>=1;i--){ add(0,i,1); } for(int i=1;i<=k;i++){ int x,a,b; scanf("%d%d%d",&x,&a,&b); if(x==1){ add(a,b,0); add(b,a,0); } else if(x==2){ add(a,b,1);if(a==b){printf("-1\n");return 0;}//<= } else if(x==3){ add(b,a,0); } else if(x==4){ add(b,a,1);if(a==b){printf("-1\n");return 0;} } else if(x==5){ add(a,b,0); } } spfa(); long long ans=0; for(int i=1;i<=n;i++)ans+=dis[i]; printf("%lld\n",ans);}