4Y
终点序最小wa了3次...
DAG最长路径
#include<stdio.h>
#include<vector>
std::vector<int>q[110];
int dp[110];
int max(int a,int b){
if(a>b)return a;
return b;
}
int min(int a,int b){
if(a<b)return a;
return b;
}
int dag(int x){
if(dp[x]!=-1)return dp[x];
dp[x]=0;
int i;
for(i=0;i<q[x].size();i++)dp[x]=max(dp[x],1+dag(q[x][i]));
return dp[x];
}
int back(int x){
std::vector<int>p;
if(dp[x]==0)return x;
int i;
for(i=0;i<q[x].size();i++){
if(dp[ q[x][i] ]==dp[x]-1){
p.push_back(q[x][i]);
}
}
int res=100;
for(i=0;i<p.size();i++){
res=min(res,back(p[i]));
}
return res;
}
int main(){
int n;
int t=0;
while(scanf("%d",&n)!=EOF&&n){
int bn;
scanf("%d",&bn);
int i;
for(i=1;i<=n;i++)q[i].clear();
for(i=1;i<=n;i++)dp[i]=-1;
int z,x;
while(scanf("%d%d",&z,&x)!=EOF){
if(z==0&&x==0)break;
q[z].push_back(x);
}
// if(t)printf("\n");
dag(bn);
int res=back(bn);
printf("Case %d: The longest path ",++t);
printf("from %d has length %d, finishing at %d.\n\n",bn,dp[bn],res);
}
return 0;
}
测试数据
5
1
1 2
1 3
3 4
2 5
1 5
0 0
0
out:
Case 1: The longest path from 1 has length 2, finishing at 4.\n\n
本文介绍了一种求解有向无环图(DAG)中最长路径问题的算法实现,并通过一个具体示例展示了如何使用该算法找到从指定起点到所有终点的最长路径及其终点。代码采用C++编写,包括递归函数`dag`用于计算最长路径长度,及`back`函数确定最终到达的节点。
97

被折叠的 条评论
为什么被折叠?



