제출 #91712

#제출 시각아이디문제언어결과실행 시간메모리
91712easruiIslands (IOI08_islands)C++14
34 / 100
2079 ms132096 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6+5;
struct Edge{
    int i,x;
    long long d;
    Edge(){};
    Edge(int a, int b, long long c){i=a;x=b;d=c;};
};

int N;
long long D[MAX],Len,Ans;
bool vE[MAX],vN[MAX],isL[MAX];
vector<Edge> I[MAX];
stack<int> L;
vector<int> Lp;

void DFS(int i)
{
    if(vN[i]){
        Lp.push_back(i);
        isL[i] = true;
        while(L.top()!=i){
            Lp.push_back(L.top());
            isL[L.top()] = true;
            L.pop();
        }
        return;
    }
    vN[i] = true;
    L.push(i);
    for(auto it : I[i]){
        if(vE[it.i]) continue;
        vE[it.i] = true;
        DFS(it.x);
    }
    if(!L.empty()) L.pop();
}

void getD(int i, int x, long long d, int r)
{
    if(isL[x]) return;
    for(auto it : I[x]){
        if(it.x==r) continue;
        getD(i,it.x,it.d+d,x);
    }
    D[i] = max(D[i],d);
}

void getL(int i, int x, long long d, int r)
{
    if(x==i) return;
    if(!isL[x]) return;
    for(auto it : I[x]){
        if(it.x==r) continue;
        getL(i,it.x,it.d+d,x);
    }
    Len = max(Len,d+D[x]+D[i]);
}
int main()
{
    cin >> N;
    for(int i=1; i<=N; i++){
        int x;
        long long d;
        cin >> x >> d;
        I[i].push_back(Edge(i,x,d));
        I[x].push_back(Edge(i,i,d));
    }
    for(int j=1; j<=N; j++){
        if(vN[j]) continue;
        Lp.clear();
        Len = 0;
        DFS(j);
        for(int i=0; i<Lp.size(); i++){
            int x = Lp[i];
            for(auto it : I[x]) getD(x,it.x,it.d,x);
        }
        for(int i=0; i<Lp.size(); i++){
            int x = Lp[i];
            for(auto it : I[x]) getL(x,it.x,it.d,x);
        }
        Ans += Len;
    }
    cout << Ans;
}

컴파일 시 표준 에러 (stderr) 메시지

islands.cpp: In function 'int main()':
islands.cpp:75:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0; i<Lp.size(); i++){
                      ~^~~~~~~~~~
islands.cpp:79:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0; i<Lp.size(); i++){
                      ~^~~~~~~~~~
#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...