BZOJ2330
题目问的就很差分约束。
太裸辣!
唯一需要注意的就是分的糖果要>=1。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+7;
int dis[maxn];
struct edge
{
int to;
int cost;
};
vector<edge> G[maxn];
int inq[maxn],cnt[maxn];
int n,k;
bool spfa()
{
queue<int> q;
q.push(0);
inq[0] = 1;
cnt[0] = 1;
while(!q.empty())
{
int now = q.front();
q.pop();
inq[now]--;
for(int i=0;i<G[now].size();i++)
{
int v = G[now][i].to;
if(dis[v]<dis[now]+G[now][i].cost)
{
dis[v] = dis[now]+G[now][i].cost;
if(++cnt[v]>=n) return false;
if(!inq[v])
{
inq[v] = 1;
q.push(v);
}
}
}
}
return true;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
{
int x,a,b;
scanf("%d%d%d",&x,&a,&b);
if(x==1)
{
G[a].push_back({b,0});
G[b].push_back({a,0});
}
if(x==2)
{
if(a==b) return 0*printf("-1\n");
G[a].push_back({b,1});
}
if(x==3)
{
G[b].push_back({a,0});
}
if(x==4)
{
if(a==b) return 0*printf("-1\n");
G[b].push_back({a,1});
}
if(x==5)
{
G[a].push_back({b,0});
}
}
for(int i=1;i<=n;i++) G[0].push_back({i,1});
if(!spfa()) return 0*printf("-1\n");
long long ans = 0;
for(int i=1;i<=n;i++) ans += dis[i];
printf("%lld\n",ans);
return 0;
}