记录编号 578512 评测结果 AAAAAAAAAA
题目名称 [SCOI2011] 糖果 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.400 s
提交时间 2023-03-23 08:38:01 内存使用 8.29 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define pb emplace_back
using pii = std::pair<int,int>;

const int maxn = 1e5 + 5;
std::vector<pii> G[maxn];
int n,m,dis[maxn],num[maxn];
std::deque<int> q;
bool vis[maxn];

bool SPFA(int s) {
    memset(dis , -0x3f , sizeof(dis));
    vis[s] = true;
    dis[s] = 1;
    q.push_back(s);
    while(!q.empty()) {
        int u = q.front();
        q.pop_front();
        vis[u] = false;
        for(auto& [v , w] : G[u])
            if(dis[v] < dis[u] + w) {
                dis[v] = dis[u] + w;
                ++ num[v];
                if(num[v] == n)
                    return false;
                if(!vis[v]) {
                	if(q.empty())
						q.push_back(v);
					else {
						if(dis[q.front()] < dis[v])
							q.push_front(v);
						else
							q.push_back(v);
					} 
                    vis[v] = true;
                }
            }
    }
    return true;
}

int main() {
	freopen("tangguo.in","r",stdin);
	freopen("tangguo.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i = 1;i <= m;++ i) {
        int op,u,v;
        scanf("%d %d %d",&op,&u,&v);
        if(u == v&&(~ op & 1))
        	return puts("-1"),0;
        switch(op) {
            case 1 : {
                G[u].pb(v , 0);
                G[v].pb(u , 0);
                break ;
            }
            case 2 : {
                G[u].pb(v , 1);
                break ;
            }
            case 3 : {
                G[v].pb(u , 0);
                break ;
            }
            case 4 : {
                G[v].pb(u , 1);
                break ;
            }
            case 5 : {
                G[u].pb(v , 0);
                break ;
            }
        }
    }
    for(int i = 1;i <= n;++ i)
        G[0].pb(i , 0);
    if(!SPFA(0)) {
        puts("-1");
        return 0;
    }
    long long ans = 0;
    for(int i = 1;i <= n;++ i)
        ans += dis[i];
    printf("%lld\n",ans);
    return 0;
}