只说需要注意的几点:
第一点,图必须是联通的,或者说,只求一张图中的一个联通子图,因为如果求了多个联通子图,输出的时候,并不知道d[]中包含的是哪一个子图的距离
第二点,d中,无解和有解需要分开,比如说,一张图是非联通的,求完其中的一个联通子图之后,肯定会有一些点没有涉及进来,这个时候,这些点的d中存储的内容应当能够和其它有结果的分辨开,比如没有涉及的点是-1,涉及到的点中的终点是0.等等
还需要注意的是,必须是无向图,无向图的构造可以只构造邻接矩阵的半张图就可以了
下面贴上代码
//俗称嵌套矩形问题 #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; const int maxn = 100; int G[maxn][maxn]; int vis[maxn]; int d[maxn]; int n = 7; //求有向无环图上的最长路径,终点的d[]是0;最大的d[]可能有很多个 int solve(int i) { if(vis[i]) { return d[i]; } vis[i] = 1; d[i] = 1;//必须是1 for(int k = 1;k <= n;k++) { if(G[i][k]) { d[i] = max(d[i],solve(k) + 1); } } return d[i]; } void print_ans(int pos) { if(d[pos] == 1) { printf("%d ",pos); return ; } printf("%d ",pos); for(int i = 1;i <= n;i++) { if(d[pos] == d[i] + 1) { print_ans(i); return ; } } } void print_b() { printf("\n"); for(int i = 1;i <= n;i++) { printf("%d ",d[i]); } printf("\n"); } void print_G() { for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { printf("%d ",G[i][j]); } printf("\n"); } } int main() { memset(vis,0,sizeof(vis)); //先建立一个有向无环图,即使是不连通的也可以 for(int i = 1;i <= n;i++) { for(int j = i + 1;j <= n;j++) { G[i][j] = rand()%2; } } print_G(); solve(1);// print_b(); //ans int pos = 1; for(int i = 1;i <= n;i++) { if(d[pos] < d[i]) pos = i; } print_ans(pos); return 0; }