#include<bits/stdc++.h>
using namespace std;
int n,k,cnt,dist[100010],head[100010],x,a,b,c[100010];
bool vis[100010];
struct node
{
int nxt;
int to;
int val;
}edge[300010];
void add(int u,int v,int w)
{
edge[++cnt].nxt=head[u];
edge[cnt].to=v;
edge[cnt].val=w;
head[u]=cnt;
}
queue<int>q;
bool spfa()
{
memset(c,0,sizeof(c));
memset(dist,0,sizeof(dist));
memset(vis,false,sizeof(vis));
vis[0]=true;
q.push(0);
c[0]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=edge[i].nxt)
{
if(dist[edge[i].to]<dist[x]+edge[i].val);
{
dist[edge[i].to]=dist[x]+edge[i].val;
if(++c[edge[i].to]>=n) return false;
if(vis[edge[i].to]==false)
{
vis[edge[i].to]=true;
q.push(edge[i].to);
}
}
}
vis[x]=false;
}
return true;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
{
int xx,a,b;
scanf("%d%d%d",&xx,&a,&b);
if(xx==1)
{
add(a,b,0);
add(b,a,0);
}
if(xx==2)
{
if(a==b)
{
printf("-1\n");
return 0;
}
else add(a,b,1);
}
if(xx==3) add(b,a,0);
if(xx==4)
{
if(a==b)
{
printf("-1\n");
return 0;
}
else add(b,a,1);
}
if(xx==5) add(a,b,0);
}
for(int i=n;i>=1;i--) add(0,i,1);
if(!spfa())
{
printf("-1\n");
return 0;
}
long long ans=0;
for(int i=1;i<=n;i++) ans+=dist[i];
printf("%lld\n",ans);
return 0;
}
下面的这个是题解
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define M 500010
#define N 100010
#define ll long long
using namespace std;
struct Edge
{
int next, to, v;
}e[M];
int n, m, cnt = 0;
int dis[N], vis[N], q[N + 10], cir[N], head[N];
inline void add_edge(int u, int v, int w)
{
e[++ cnt].next = head[u];
e[cnt].to = v;
e[cnt].v = w;
head[u] = cnt;
}
int SPFA(int x)
{
memset(cir, 0, sizeof(cir));
memset(dis, 0, sizeof(dis));
memset(vis, 0, sizeof(vis));
vis[0] = 1;
int l = 0, r = 1;
q[0] = 0;
cir[0] = 1;
while(l != r)
{
int now = q[l];
l ++;
if(l == N) l = 0;
for(int i = head[now]; i; i = e[i].next)
if(dis[now] + e[i].v > dis[e[i].to])
{
dis[e[i].to] = dis[now] + e[i].v;
if(++ cir[e[i].to] >= n) return 0;
if(!vis[e[i]. to])
{
vis[e[i].to] = 1;
q[r ++] = e[i].to;
if(r == N) r = 0;
}
}
vis[now] = 0;
}
return 1;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i ++)
{
int p, u, v;
scanf("%d %d %d",&p, &u, &v);
if(p == 1) add_edge(u, v, 0), add_edge(v, u, 0);
if(p == 2)
if(u == v) {printf("-1");return 0;}
else add_edge(u, v, 1);
if(p == 3) add_edge(v, u, 0);
if(p == 4)
if(u == v) {printf("-1");return 0;}
else add_edge(v, u, 1);
if(p == 5)
add_edge(u, v, 0);
}
for(int i = n; i > 0; i --)
add_edge(0, i, 1);
if(!SPFA(0))
{
printf("-1");
return 0;
}
ll ans = 0;
for(int i = 1; i <= n; i ++)
ans += dis[i];
printf("%lld", ans);
return 0;
}
感觉只有手写队列和STL的区别,可能问题就出在那里,但是我不明白为什么