當前位置:首頁 » 編程語言 » java向圖

java向圖

發布時間: 2022-11-18 04:20:33

❶ 用java怎麼用迪傑斯特拉算有向圖有權值的最短路徑

Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。

Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表方式
用OPEN,CLOSE表的方式,其採用的是貪心法的演算法策略,大概過程如下:
1.聲明兩個集合,open和close,open用於存儲未遍歷的節點,close用來存儲已遍歷的節點
2.初始階段,將初始節點放入close,其他所有節點放入open
3.以初始節點為中心向外一層層遍歷,獲取離指定節點最近的子節點放入close並從新計算路徑,直至close包含所有子節點

代碼實例如下:
Node對象用於封裝節點信息,包括名字和子節點
[java] view plain
public class Node {
private String name;
private Map<Node,Integer> child=new HashMap<Node,Integer>();
public Node(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<Node, Integer> getChild() {
return child;
}
public void setChild(Map<Node, Integer> child) {
this.child = child;
}
}

MapBuilder用於初始化數據源,返回圖的起始節點
[java] view plain
public class MapBuilder {
public Node build(Set<Node> open, Set<Node> close){
Node nodeA=new Node("A");
Node nodeB=new Node("B");
Node nodeC=new Node("C");
Node nodeD=new Node("D");
Node nodeE=new Node("E");
Node nodeF=new Node("F");
Node nodeG=new Node("G");
Node nodeH=new Node("H");
nodeA.getChild().put(nodeB, 1);
nodeA.getChild().put(nodeC, 1);
nodeA.getChild().put(nodeD, 4);
nodeA.getChild().put(nodeG, 5);
nodeA.getChild().put(nodeF, 2);
nodeB.getChild().put(nodeA, 1);
nodeB.getChild().put(nodeF, 2);
nodeB.getChild().put(nodeH, 4);
nodeC.getChild().put(nodeA, 1);
nodeC.getChild().put(nodeG, 3);
nodeD.getChild().put(nodeA, 4);
nodeD.getChild().put(nodeE, 1);
nodeE.getChild().put(nodeD, 1);
nodeE.getChild().put(nodeF, 1);
nodeF.getChild().put(nodeE, 1);
nodeF.getChild().put(nodeB, 2);
nodeF.getChild().put(nodeA, 2);
nodeG.getChild().put(nodeC, 3);
nodeG.getChild().put(nodeA, 5);
nodeG.getChild().put(nodeH, 1);
nodeH.getChild().put(nodeB, 4);
nodeH.getChild().put(nodeG, 1);
open.add(nodeB);
open.add(nodeC);
open.add(nodeD);
open.add(nodeE);
open.add(nodeF);
open.add(nodeG);
open.add(nodeH);
close.add(nodeA);
return nodeA;
}
}
圖的結構如下圖所示:

Dijkstra對象用於計算起始節點到所有其他節點的最短路徑
[java] view plain
public class Dijkstra {
Set<Node> open=new HashSet<Node>();
Set<Node> close=new HashSet<Node>();
Map<String,Integer> path=new HashMap<String,Integer>();//封裝路徑距離
Map<String,String> pathInfo=new HashMap<String,String>();//封裝路徑信息
public Node init(){
//初始路徑,因沒有A->E這條路徑,所以path(E)設置為Integer.MAX_VALUE
path.put("B", 1);
pathInfo.put("B", "A->B");
path.put("C", 1);
pathInfo.put("C", "A->C");
path.put("D", 4);
pathInfo.put("D", "A->D");
path.put("E", Integer.MAX_VALUE);
pathInfo.put("E", "A");
path.put("F", 2);
pathInfo.put("F", "A->F");
path.put("G", 5);
pathInfo.put("G", "A->G");
path.put("H", Integer.MAX_VALUE);
pathInfo.put("H", "A");
//將初始節點放入close,其他節點放入open
Node start=new MapBuilder().build(open,close);
return start;
}
public void computePath(Node start){
Node nearest=getShortestPath(start);//取距離start節點最近的子節點,放入close
if(nearest==null){
return;
}
close.add(nearest);
open.remove(nearest);
Map<Node,Integer> childs=nearest.getChild();
for(Node child:childs.keySet()){
if(open.contains(child)){//如果子節點在open中
Integer newCompute=path.get(nearest.getName())+childs.get(child);
if(path.get(child.getName())>newCompute){//之前設置的距離大於新計算出來的距離
path.put(child.getName(), newCompute);
pathInfo.put(child.getName(), pathInfo.get(nearest.getName())+"->"+child.getName());
}
}
}
computePath(start);//重復執行自己,確保所有子節點被遍歷
computePath(nearest);//向外一層層遞歸,直至所有頂點被遍歷
}
public void printPathInfo(){
Set<Map.Entry<String, String>> pathInfos=pathInfo.entrySet();
for(Map.Entry<String, String> pathInfo:pathInfos){
System.out.println(pathInfo.getKey()+":"+pathInfo.getValue());
}
}
/**
* 獲取與node最近的子節點
*/
private Node getShortestPath(Node node){
Node res=null;
int minDis=Integer.MAX_VALUE;
Map<Node,Integer> childs=node.getChild();
for(Node child:childs.keySet()){
if(open.contains(child)){
int distance=childs.get(child);
if(distance<minDis){
minDis=distance;
res=child;
}
}
}
return res;
}
}

Main用於測試Dijkstra對象
[java] view plain
public class Main {
public static void main(String[] args) {
Dijkstra test=new Dijkstra();
Node start=test.init();
test.computePath(start);
test.printPathInfo();
}
}

❷ 求一段java程序,求圖是否存在環。該圖是有向圖。要求該方法輸入邊的序對集合,比如3->4啊4->

一個頂點a在一個環上,那麼存在以它為終點的邊, 假設這些邊的起點集合為PreA, 考察點a能否到達點PreA中的點,如果到達就找到了一個環,否則點a不在環上。

遍歷圖中的頂點進行上述操作即可。

❸ JAVA 往圖片裡面放系統時間

1樓,覺得你理解錯誤了,他是想把系統時間放在圖片上,而不是時間和圖片分開放置。
學習下。
等待答案中。。。。
我也只能把它分開放置:
public class Show extends JFrame implements Runnable {
JLabel jl;
JLabel j2;
public Show() {
super("時間顯示");
jl = new JLabel();
j2 = new JLabel();
setLayout(new BorderLayout()); // 設置布局管理器
double lx = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double ly = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
setLocation((int) lx / 2 - 150, (int) ly / 2 - 150);
j2.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage(
"C:\\1.jpg")));
add(j2, "Center");
add(jl, "North");
setSize(400, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 關閉按鈕退出程序
}

public void run() {
while (true) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
jl.setText(sdf.format(new Date()));
try {
Thread.sleep(1000);
} catch (Exception e) {
jl.setText("出錯錯誤,請重啟程序");
}
}
}

public static void main(String arg[]) {
Show t = new Show();
Thread thread1 = new Thread(t);
thread1.start();
}
}
慚愧。。

❹ java讀取txt文檔並將數據當做節點構成有向圖!

分少懶得寫,添加一個畫布組件,節點用圓形素材,有向圖用箭頭素材。
先添加節點, 後連線,完畢

❺ java怎麼繪制有向圖

packagetest;

importjava.util.*;

publicclassGectorGraph{
privatePointroot;
privateList<List<String>>circlePath;

publicGectorGraph(StringpointName){
root=newPoint(pointName);
}
publicGectorGraph(Pointpoint){
root=point;
}

publicbooleanhasCirclePath(){
findCirclePath();
returncirclePath.size()>0;
}

publicvoidfindCirclePath(){
List<Point>CirclePoints=findCirclePoint();
if(circlePath==null){circlePath=newArrayList<List<String>>();}
for(PointtempPoint:CirclePoints){
List<String>pointPath=newArrayList<String>();
findPointPath(tempPoint,root,pointPath);
pointPath.add(root.pointName);
circlePath.add(pointPath);
}
}

publicbooleanfindPointPath(Pointtarget,PointcurrentPoint,List<String>pointPath){
if(currentPoint.equals(target)){returntrue;}
if(!currentPoint.hasNext()){returnfalse;}
List<Point>pointList=currentPoint.getNextPointList();
for(PointtempPoint:pointList){
if(tempPoint.equals(root)){continue;}
if(findPointPath(target,tempPoint,pointPath)){
pointPath.add(tempPoint.pointName);
returntrue;
}
}
returnfalse;
}

privateList<Point>findCirclePoint(){
if(!root.hasNext()){returnnull;}
List<Point>circlePoints=newArrayList<Point>();
findCirclePoint(root,root,circlePoints);
returncirclePoints;
}
privatevoidfindCirclePoint(Pointroot,PointcurrentPoint,List<Point>circlePoints){
if(!currentPoint.hasNext()){return;}
List<Point>pointList=currentPoint.getNextPointList();
for(PointtempPoint:pointList){
if(tempPoint.equals(root)){circlePoints.add(currentPoint);}
else{findCirclePoint(root,tempPoint,circlePoints);}
}
}
publicvoidshowPath(){
if(circlePath==null){System.out.println("Error");}
for(List<String>tempList:circlePath){
StringBufferpathString=newStringBuffer();
inttempListIndex=tempList.size()-1;
for(;tempListIndex>-1;tempListIndex--){
pathString.append(tempList.get(tempListIndex));
if(tempListIndex!=0){pathString.append("->");}
}
System.out.println(pathString.toString());
}
}
publicstaticvoidmain(String[]args){
Pointroot=newPoint("root");

List<Point>p3=newArrayList<Point>();
for(inti=0;i<3;i++){
p3.add(newPoint("3/1/"+i));
}
List<Point>p4=newArrayList<Point>();
for(inti=0;i<3;i++){
p4.add(newPoint("3/2/"+i));
}

List<Point>p2=newArrayList<Point>();
for(inti=0;i<2;i++){
p2.add(newPoint("2/"+i));
}

p3.add(0,root);
p3.get(2).addNextPoint(root);
p4.get(0).addNextPoint(root);
p2.get(0).addNextPointList(p3);
p2.get(1).addNextPointList(p4);
root.addNextPointList(p2);

GectorGraphgg=newGectorGraph(root);
if(gg.hasCirclePath()){
gg.showPath();
}
}
}
classPoint{
publicStringpointName;
privateList<Point>nextPointList;
publicPoint(StringpointName){
this.pointName=pointName;
}
publicvoidaddNextPoint(Pointp){
if(nextPointList==null){nextPointList=newArrayList<Point>();}
nextPointList.add(p);
}
publicvoidaddNextPointList(List<Point>pList){
if(nextPointList==null){nextPointList=newArrayList<Point>();}
nextPointList.addAll(pList);
}
publicbooleanhasNext(){
returnnextPointList!=null&&!nextPointList.isEmpty();
}
publicList<Point>getNextPointList(){
returnnextPointList;
}
publicvoidsetNextPointList(List<Point>nextPointList){
this.nextPointList=nextPointList;
}
}

❻ java如何畫出無向圖

如果用java來處理無向圖的邏輯是辦不到的,因為java里根本就沒有這個類,
只能通過數據結構先把無向圖的邏輯搞清楚,然後java來呈現,可以用 JComponent的 paint(Graphics g) 方法繪畫

❼ 求java代碼,關於帶權有向圖找最短距離,數據結構方面

so..................復雜

❽ JAVA如何生成一個隨機的有向連通圖

很簡單,全部的邊存在就是強連通的(要去掉一部分也可以) 也可以把所有點組成一個有向圈 再隨機加點邊就是了

把矩陣所有的成員都賦一個大於零的隨機數

❾ 怎麼在java界面中顯示已經構造的有向圖

取出Screen的大小,和本身界面的大小, 算出界面的左上角坐標即可

熱點內容
天水移動伺服器地址 發布:2025-01-14 02:48:22 瀏覽:599
h3c防火牆怎麼保存配置 發布:2025-01-14 02:36:00 瀏覽:891
91網友上傳視頻 發布:2025-01-14 02:31:39 瀏覽:789
linux系統下載iso下載 發布:2025-01-14 02:31:34 瀏覽:698
ftp代理ip 發布:2025-01-14 02:29:46 瀏覽:886
設qq密碼時應該設什麼 發布:2025-01-14 02:13:20 瀏覽:605
劍俠情緣主線腳本 發布:2025-01-14 02:11:05 瀏覽:411
java執行ftp命令 發布:2025-01-14 02:05:21 瀏覽:937
青檸檬編程 發布:2025-01-14 02:05:18 瀏覽:882
下載加密日記本 發布:2025-01-14 02:05:16 瀏覽:539