各路大佬速来救我!!!50pts!
查看原帖
各路大佬速来救我!!!50pts!
1141399
yanguo12138楼主2024/5/12 10:32
#include <iostream>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
using namespace std;
#define ll long long
const int N = 1e6 + 5;
int dist[N];
int n, m;
typedef pair<int, int>pii;
bool st[N];
int cnt[N];
vector<pii>q[N];
bool spfa()
{
    memset(dist, -0x3f3f3f, sizeof(dist));
    queue<int>qq;
    qq.push(0);
    dist[0] = 0;
    st[0] = true;
    while (qq.size())
    {
        int t = qq.front();
        qq.pop();
        st[t] = true;
        for (int i = 0; i < q[t].size(); i++)
        {
            int v = q[t][i].first, w = q[t][i].second;
            if (dist[v] < dist[t] + w)
            {
                dist[v] = dist[t] + w;
                cnt[v] = cnt[t] + 1;
                if (cnt[v] >= n+m)return false;               
                qq.push(v);
                st[v] = true;           
            }
        }
    }
    return true;
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int num1, num2, num3;
        cin >> num1 >> num2 >> num3;
        if (num1 == 1)
        {
            q[num2].push_back(make_pair(num3, 0));
            q[num3].push_back(make_pair(num2, 0));
        }
        else if (num1 == 2)q[num2].push_back(make_pair(num3, 1));
        else if (num1 == 3)q[num2].push_back(make_pair(num3, 0));
        else if (num1 == 4)q[num3].push_back(make_pair(num2, 1));
        else if (num1 == 5)q[num2].push_back(make_pair(num3, 0));
    }
    for (int i = 1; i <= n; i++)
    {
        q[0].push_back(make_pair(i,1));
    } 
    bool ty = spfa();
    if (ty)
    {
        ll ans = 0;
        for (int i = 1; i <= n; i++)
        {
            ans += dist[i];
        } 
        cout << ans << endl;
    }
    else
    {
        cout << -1 << endl;
    }
    return 0;
}
2024/5/12 10:32
加载中...