Submission #1324747

#TimeUsernameProblemLanguageResultExecution timeMemory
1324747yifanzzzTales of seafaring (POI13_mor)C++20
0 / 100
1461 ms26784 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<int>adj[5001];
vector<int> d(10002,-1);
vector<int> ptern(5001,-1);
vector<int> ans(1000001);
vector<pair<pair<int,int>,int> >st[5001];
int n,m,k;
void bfsm(int nd){ //just to mark the patterns
    queue<int> q;
    while(!q.empty())q.pop();
    q.push(nd);
    ptern[nd]=0;
    while(!q.empty()){
        int t=q.front(); q.pop();
        for(int u:adj[t]){
            if(ptern[u]==-1) q.push(u);
            ptern[u]=(ptern[t]+1)%2;
        }
    }
}
void bfsr(int nd){ //the real bfs; dnorm and dfl
    queue<int> q;
    while(!q.empty())q.pop();
    q.push(nd);
    d[nd]=0;
    while(!q.empty()){
        int t=q.front(); q.pop();
        if(t<=n){ //under
            for(int u:adj[t]){
                if(d[u]==-1){
                    d[u]=d[t]+1;
                    q.push(u);
                } else if ((d[u]%2)==(d[t]%2)){
                    d[u+n]=d[t]+1;
                    q.push(u+n);
                }
            }
        } else { //above
            for(int u:adj[t]){
                if(d[u]==-1){
                    if((ptern[u]-n+1)%2==(d[t]+1)%2){
                        d[u]=d[t]+1;
                        q.push(u);
                    }
                }
            }
        }
    }
}
int main(){
    cin >> n >> m >> k;
    for(int i=1; i<=m; i++) {
        int a,b; cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    for(int i=1; i<=k; i++) {
        int a,b,c; cin >> a >> b >> c;
        st[a].push_back(make_pair(make_pair(b,c),i));
    }
    int p=0;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            d[j]=-1;
            d[j+n]=-1;
            ptern[j]=-1;
        }
        bfsm(i);
        bfsr(i);
        // cout << i << endl;
        // for(int i=1; i<=n; i++) {
        //     cout << ptern[i] << " ";
        // }
        // cout << endl;
        // for(int i=1; i<=n; i++) {
        //     cout << d[i] << " ";
        // }
        // cout << endl;
        for(auto u:st[i]){
            int dis=d[u.first.first];
            if(dis==-1){
                ans[u.second]=0;
                // cout << "NIE1" << endl;
            } else if((dis%2)!=(u.first.second%2)) {
                dis=d[u.first.first+n];
                if(dis==-1) {
                    ans[u.second]=0;
                    // cout << "NIE2" << endl;
                } else {
                    if(u.first.second<dis){
                        ans[u.second]=0;
                        // cout << "NIE3" << endl;
                    } else {
                        ans[u.second]=1;
                        // cout << "TAK1" << endl;
                    }
                }
            } else {
                if(u.first.second<dis){
                    ans[u.second]=0;
                    // cout << "NIE4" << endl;
                } else {
                    ans[u.second]=1;
                    // cout << "TAK2" << endl;
                }
            }
        }
    }
    for(int i=1; i<=k; i++) {
        if(ans[i]==1){
            cout << "TAK" << endl;
        } else {
            cout << "NIE" << endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...