62,614
社区成员
发帖
与我相关
我的任务
分享
package longestpath;
//求最长路径
public class Path {
private static int[][] graph={
//0--表示不存在有向边
{0,5,0,0,0,0,0,0}, //0
{0,0,10,0,0,0,0,0}, //1
{0,0,0,20,0,20,0,0}, //2
{0,0,0,0,30,0,0,0}, //3
{0,0,0,0,0,0,40,0}, //4
{0,0,0,0,0,0,0,50}, //5
{0,0,0,0,0,0,0,0}, //6
{0,0,0,0,0,0,70,0} //7
};
private static String[] path=new String[graph.length];//每一个结点的目前的路径
private static int[] value=new int[graph.length];//结点目前的路径值
private static int[] indegree=new int[graph.length];//每一个结点的入度
private static int[] stack=new int[graph.length+1];//入度为零的结点栈
private static int top=-1;//栈指针。-1表示空栈
private static int total=0;//已计算了多少个结点
private static void init()//初始化
{
for(int i=0;i<graph.length;i++)
{
path[i]="";
value[i]=0;
}
}
//从0t结点开始计算
private static void calPath()
{
path[0]="0";
value[0]=0;
//计算每一个结点的入度,若为零,则进栈
for(int i=0;i<graph.length;i++)
{
for(int j=0;j<graph.length;j++)
{
if(graph[j][i]!=0){indegree[i]++;}
}
if(indegree[i]==0) stack[++top]=i;//入栈
}//for
while(top>=0)//栈不空时
{
int p=stack[top--];//出栈
for(int j=0;j<graph.length;j++)//对每一个p发出的有向边:p->j
{
if(graph[p][j]!=0)//p->j是一条有向边
{
if(value[p]+graph[p][j]>value[j])
{//比它现有的值更大
value[j]=value[p]+graph[p][j];//记下新值
path[j]=path[p]+"->"+j;//记下路径
}
//p->j已计算过,j的入度减1(相当于去掉p->j这条有向边),若为零,则入栈
if(--indegree[j]==0){stack[++top]=j;}
}//if
}
total++;//已计算了一个结点。
}//while
if(total<graph.length)
{
System.out.println("有向图中有环路,无法计算。");
System.exit(-1);
}
}//calPath
//打印路径与值
//end--汇集结点
private static void print(int end)
{
System.out.println("最长路径:"+path[end]+" 值:"+value[end]);
}
public static void main(String[] args) {
// TODO 自动生成方法存根
calPath();//求最长路径
print(6);//打印汇集结点6的路径与值
}
}