爆搜,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 }