这题卡vector存图?还是我写丑了
查看原帖
这题卡vector存图?还是我写丑了
1301050
ssk_e楼主2025/8/4 21:44
#include<bits/stdc++.h>
using namespace std;
#define endl '\n' 
typedef unsigned long long ull;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
template<typename T> using min_heap=priority_queue<T,vector<T>,greater<T>>;
template<typename T> using max_heap=priority_queue<T>;
template<typename T> T isqrt(const T &x){T y=sqrt(x+2); while(y*y>x) y--; return y;}
const int INF = 1e18;
const int N = 2e6 + 5;
vector<int>arr3[N];
int a[N],n,m,k,vis[N],instk[N],flag;
int tme[N],can[N];
int stk[N],top;
void dfs(int u,int fa)
{
    //cerr << u << endl;
    if(!can[u] || flag) return ;
    if(vis[u])
    {
        if(instk[u])
        {
            int x;
            do
            {
                x = stk[top--];
                instk[x] = 0;
            } while (x != u);
            flag = 1;
        }
        return ;
    }
    stk[++top] = u;
    instk[u] = 1;
    vis[u]++;
    for(int v : arr3[u])
    {
        if(v == fa) continue;
        dfs(v,u);
    }
    if(instk[u])    
    {
        instk[u] = 0;
        top--;
    }
}
queue<pair<int,int>>q;
bool check(int x)
{
    for(int i = 1;i <= n;i++)   can[i]  = vis[i] = 0;
    top = 0;
    int root = 1;
    for(int i = 1;i <= n;i++)
    {
        if(tme[i] > x + 1) continue;
        can[i] = 1;
    }
    flag = 0;
    for(int i = 1;i <= n;i++)
    {
        if(vis[i])  continue;
        dfs(i,0);
        if(flag)    return true;
    }
    return false;
}
void solve()
{
    cin >> n >> m >> k;
    for(int i = 1;i <= m;i++)
    {
        int u,v;
        cin >> u >> v;
        arr3[u].push_back(v);
        arr3[v].push_back(u);
    }
    for(int i = 1;i <= k;i++)   cin >> a[i];
    for(int i = 1;i <= k;i++)   q.push({a[i],1});
    while(q.size())
    {
        auto [u,sum] = q.front();
        q.pop();
        if(tme[u])  continue;
        tme[u] = sum;
        for(int v : arr3[u])
        {
            if(tme[v])  continue;
            q.push({v,sum + 1});
        }
    }
    int l = 0,r = N;
    while(l < r)
    {
        int mid = l + r >> 1;
        if(check(mid))  r = mid;
        else    l = mid + 1;
    }
    if(l < N) cout << l << endl;
    else    cout << "Poor D!" << endl;
    return;
}
signed main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    int tt = 1;
    while(tt--)
    {
        solve();
    }
    return 0;
}

把vector改成前向星就过了,有大佬知道为啥吗

2025/8/4 21:44
加载中...