这是java的eclipse做的程序的源代码,编译成功,测试也正确。下面不多说,附代码:
package DNFLTFZ;
public class DFSLT {
/**
* 这里是注释文档
* * S表示无穷大
*
* 连通分量设置为3个
* 0 1 2 3 4 5 6 7 8
* -------------------------
* 0
* 1 s s s s s s s s
* 2 s s s 1 1 s s s
* 3 s s s s s 1 1 s
* 4 s 1 s s s s s 1
* 5 s 1 s s s s s 1
* 6 s s 1 s s s 1 s
* 7 s s 1 s s 1 s s
* 8 s s s 1 1 s s s
*
*
* @param args
*/
static int color[];
static int d =0;
public static void main(String[] args) {
int s = Integer.MAX_VALUE;
int G[][]={{s,s,s,s,s,s,s,s,s},
{s,s,s,s,s,s,s,s,s},
{s,s,s,s,1,1,s,s,s},
{s,s,s,s,s,s,1,1,s},
{s,s,1,s,s,s,s,s,1},
{s,s,1,s,s,s,s,s,1},
{s,s,s,1,s,s,s,1,s},
{s,s,s,1,s,s,1,s,s},
{s,s,s,s,1,1,s,s,s}};
color = new int [9];
ProcedureDFS(G,9);
PDLTGS(color);
}
private static void PDLTGS(int[] color2) {
// TODO 自动生成的方法存根
int temp;
for(int i=1;i<color2.length;i++){
for(int j=color2.length-2;j>=1;j--)
{
if(color2[j+1]<color2[j]){
temp=color2[j+1];
color2[j+1]=color2[j];
color2[j]=temp;
}
}
}
for(int i=1;i<color2.length-1;i++){
if(color2[i+1]!=color2[i])
d++;
}
System.out.println("连通分量的个数:"+(d+1));
}
public static void ProcedureDFS(int [][]G,int n){
//图是以二维数组的形式保存
//n是二维数组的维数,n需要小于10,结果才会正确,否则算法上,初始化没搜索就需要换一个数字
for(int i=1;i <= n-1;i++){
color[i]=10;//把每一个顶点都置为10,表示还没搜索
}
for(int i=1;i<= n-1;i++){
//对于每一个顶点没被访问的顶点进行访问
if(color[i] == 10){
color[i]=i;
DFS_visit(G,i,color[i]);//遍历其访问的顶点
}
}
}
private static void DFS_visit(int[][] g, int i, int color2) {
for(int t=1;t<= g.length-1;t++){
//邻接点没有被访问到
if(color[t] == 10 && g[i][t] != Integer.MAX_VALUE){
color[t] = color2;
DFS_visit(g,t,color[t]);
}
}
}
}