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 }
原文地址:https://www.cnblogs.com/poler/p/7375620.html