可以把问题转换为一个有向图中求最长路的过程,需要Floyd算法来打印最长路。保存即可。
http://acm.timus.ru/problem.aspx?space=1&num=1078
1: 2: #include <queue> 3: #include <iostream>4: #include <string.h>
5: #include <stdio.h>6: using namespace std;
7: #define V 505 // vertex
8: #define INF 0x3F3F3F3F
9: int N;
10: int dis[V][V];
11: int path[V][V];
12: 13: // normal distance.
14: void floyd()
15: {16: for(int k=1;k<=N;k++)
17: {18: for(int i=1;i<=N;i++)
19: {20: for(int j=1;j<=N;j++)
21: {22: if(dis[i][k]== -INF || dis[k][j] == -INF) continue;
23: if(dis[i][k] + dis[k][j] > dis[i][j])
24: { 25: dis[i][j] = dis[i][k] + dis[k][j]; 26: path[i][j] = path[i][k]; 27: } 28: 29: } 30: } 31: } 32: }33: void floyd_path(int i, int j)
34: {35: int k=path[i][j];
36: while(k!=j)
37: {38: printf(" %d", k );
39: k= path[k][j]; 40: } 41: } 42: 43: int main()
44: {45: //freopen("1078.txt","r",stdin);
46: scanf("%d", &N);
47: int a, b;
48: vector<pair<int, int> > C;
49: memset(dis, 0 ,sizeof(dis));
50: for(int i=0; i<N; i++)
51: {52: scanf("%d%d", &a, &b);
53: C.push_back(make_pair(a,b));54: for(int i=0; i<C.size(); i++)
55: {56: if(a<C[i].first && b> C[i].second)
57: { 58: dis[i+1][C.size()] = 1; 59: path[i+1][C.size()] = C.size(); 60: }61: else if(a> C[i].first && b< C[i].second)
62: { 63: dis[C.size()][i+1]=1; 64: path[C.size()][i+1] = i+1; 65: } 66: } 67: }68: for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) if(dis[i][j]==0) dis[i][j]=-INF;
69: floyd();70: int ret = 0;
71: for(int i=1; i<=N; i++)
72: {73: for(int j=1; j<=N; j++)
74: {75: if(dis[i][j] > ret)
76: { 77: ret = dis[i][j]; 78: a = i; b = j; 79: } 80: } 81: }82: if(ret == 0)
83: { 84: cout<<1<<endl; 85: cout<<1<<endl;86: }else
87: { 88: cout<<ret+1<<endl; 89: cout<<a; 90: floyd_path(a,b);91: cout<<" "<<b<<endl;
92: }93: return 0;
94: } 95:
浙公网安备 33010602011771号