zoukankan      html  css  js  c++  java
  • 2012 East Central Regional Contest Gym100642A

    爆搜,3^n枚举, DAG上最长路。

    但是注意,并不是一个直接的dag,有完全相同的,合并成一个点。

     1 #include<bits/stdc++.h>
     2 #define LL long long
     3 #define Pii pair<int,int>
     4 #define fi first
     5 #define se second
     6 #define maxn 110
     7 #define mp make_pair
     8 #define pb push_back
     9 using namespace std;
    10 struct Node{
    11     int x,y,z;
    12 }seg[maxn];
    13 Pii a[maxn];
    14 int in[maxn],vis[maxn],dp[maxn],size[maxn];
    15 int n,ans;
    16 vector<int>G[maxn];
    17 void Dp(){
    18     for(int i=1;i<=n;i++){
    19         if(a[i].fi>a[i].se) swap(a[i].fi,a[i].se);
    20         G[i].clear();
    21         in[i]=0;
    22         size[i]=1;
    23         vis[i]=false;
    24     }
    25     for(int i=1;i<=n;i++){
    26         if(!vis[i]) 
    27             for(int j=1;j<=n;j++){
    28                 if(i==j) continue;
    29                 if(a[i]==a[j]){
    30                     size[i]++;
    31                     vis[j]=true;
    32                 }
    33             }
    34             
    35         }
    36     for(int i=1;i<=n;i++) dp[i]=size[i];
    37     for(int i=1;i<=n;i++){
    38         if(vis[i]) continue;
    39         for(int j=1;j<=n;j++){
    40             if(i==j||vis[j]) continue;
    41             if(a[i].fi==a[j].fi&&a[i].se==a[j].se){
    42                 
    43             }
    44             if(a[i].fi<=a[j].fi&&a[i].se<=a[j].se){
    45                 G[j].pb(i);
    46                 in[i]++;    
    47             }
    48         }
    49     }
    50     queue<int>Q;
    51     for(int i=1;i<=n;i++) if(!in[i]&&!vis[i]) Q.push(i);
    52     int now,p;
    53     while(!Q.empty()){
    54         now=Q.front();
    55         Q.pop();
    56         for(int i=0;i<G[now].size();i++){
    57             if(vis[G[now][i]]) continue;
    58             dp[G[now][i]]=max(dp[G[now][i]],dp[now]+size[G[now][i]]);
    59             in[G[now][i]]--;
    60             if(!in[G[now][i]]) Q.push(G[now][i]);
    61         }
    62     }
    63     for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
    64 }
    65 void dfs(int pos){
    66     if(pos==n+1){
    67         Dp();
    68         return;
    69     }
    70     a[pos].fi=seg[pos].x,a[pos].se=seg[pos].y;
    71     dfs(pos+1);
    72     a[pos].fi=seg[pos].x,a[pos].se=seg[pos].z;
    73     dfs(pos+1);
    74     a[pos].fi=seg[pos].y,a[pos].se=seg[pos].z;
    75     dfs(pos+1);
    76 }
    77 int main(){
    78     int tot=0;
    79     while(scanf("%d",&n)){
    80         if(!n) break;
    81         for(int i=1;i<=n;i++){
    82             scanf("%d%d%d",&seg[i].x,&seg[i].y,&seg[i].z);
    83         }
    84         ans=0;
    85         dfs(1);
    86         printf("Case %d: %d
    ",++tot,ans);
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    前端 -- html
    MySQL索引
    Python操作MySQL
    MySQL表操作进阶
    MySQL表操作基础
    Github使用教程
    Android开发面试题
    MYSQL学习记录
    Java开发从零到现在
    JavaWeb(JSP/Servlet/上传/下载/分页/MVC/三层架构/Ajax)
  • 原文地址:https://www.cnblogs.com/poler/p/7375620.html
Copyright © 2011-2022 走看看