답안 #569218

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
569218 2022-05-27T05:09:42 Z Waratpp123 Love Polygon (BOI18_polygon) C++14
29 / 100
342 ms 34552 KB
#include<bits/stdc++.h>
using namespace std;
map<string,int> mp;
string ss[100010],se[100010];
vector<int> g[100010],gb[100010];
queue<int> topo,bfs;
int in[100010],dp[100010][2],sum,ch[100010];
void dfs(int i,int p){
    for(auto x : gb[i]){
        if(x==p||in[x]>0) continue;
        dfs(x,i);
    }
    int mx=0;
    for(auto x : gb[i]){
        if(x==p||in[x]>0) continue;
        dp[i][1]+=dp[x][0];
        mx=max(mx,dp[x][1]-dp[x][0]);
    }
    dp[i][0]=mx+dp[i][1];
    dp[i][1]++;
}
int findloop(vector<int> t){
    if(t.size()==1) return 0;
}
int main(){
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        cin >> ss[i] >> se[i];
        mp[ss[i]]=i;
    }
    if(n%2!=0){
        printf("-1");
        return 0;
    }
    for(i=1;i<=n;i++){
        int sss=mp[ss[i]];
        int sse=mp[se[i]];
        g[sss].push_back(sse);
        gb[sse].push_back(sss);
        in[sse]++;
    }
    for(i=1;i<=n;i++){
        if(in[i]==0) topo.push(i);
    }
    while(!topo.empty()){
        i=topo.front();
        topo.pop();
        in[i]--;
        for(auto x : g[i]){
            in[x]--;
            if(in[x]==0){
                topo.push(x);
            }
        }
    }
    int cnt=0;
    int ans=0;
    for(i=1;i<=n;i++){
        if(in[i]>0){
            dfs(i,-1);
            ans+=dp[i][0];
        }
    }
    vector<int> t;
    for(i=1;i<=n;i++){
        if(in[i]>0){
            if(ch[i]==0){
                bfs.push(i);
                ch[i]=1;
                t.clear();
                while(!bfs.empty()){
                    j=bfs.front();
                    bfs.pop();
                    t.push_back(dp[j][1]-dp[j][0]);
                    for(auto x : g[j]){
                        if(ch[x]==0){
                            bfs.push(x);
                            ch[x]=1;
                        }
                    }
                }
            }
            ans+=(max(0,findloop(t)));
        }
    }
    printf("%d\n",n-ans);
return 0;
}
/*
8
leonard emmy
ada emmy
isaac leonard
emmy pierre
pierre bernhard
bernhard emmy
sofia karl
karl sofia
*/

Compilation message

polygon.cpp: In function 'int main()':
polygon.cpp:57:9: warning: unused variable 'cnt' [-Wunused-variable]
   57 |     int cnt=0;
      |         ^~~
polygon.cpp: In function 'int findloop(std::vector<int>)':
polygon.cpp:24:1: warning: control reaches end of non-void function [-Wreturn-type]
   24 | }
      | ^
polygon.cpp: In function 'int main()':
polygon.cpp:27:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   27 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 11220 KB Output is correct
2 Correct 8 ms 11276 KB Output is correct
3 Correct 7 ms 11276 KB Output is correct
4 Incorrect 6 ms 11280 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11220 KB Output is correct
2 Incorrect 8 ms 11204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 304 ms 26240 KB Output is correct
2 Correct 321 ms 29700 KB Output is correct
3 Correct 191 ms 29112 KB Output is correct
4 Correct 123 ms 21320 KB Output is correct
5 Correct 320 ms 34552 KB Output is correct
6 Correct 342 ms 27392 KB Output is correct
7 Correct 291 ms 27732 KB Output is correct
8 Correct 286 ms 28084 KB Output is correct
9 Correct 252 ms 26884 KB Output is correct
10 Correct 221 ms 26240 KB Output is correct
11 Correct 6 ms 11220 KB Output is correct
12 Correct 7 ms 11220 KB Output is correct
13 Correct 6 ms 11216 KB Output is correct
14 Correct 6 ms 11220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 11220 KB Output is correct
2 Correct 8 ms 11276 KB Output is correct
3 Correct 7 ms 11276 KB Output is correct
4 Incorrect 6 ms 11280 KB Output isn't correct
5 Halted 0 ms 0 KB -