首页 > 编程语言 >Java_02

Java_02

时间:2023-12-08 17:35:17浏览次数:29  
标签:02 Java THEMAX int locateVex 顶点 adj First

7-1 邻接表存储实现图的深度优先遍历

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
int a[MAXSIZE]={0};
//边表
typedef struct At{
    int t;          //保存邻接点下标
    char wei;       //储存权值
    struct At* next; //链域,指向下一个邻接点
}At;
//顶点表
typedef struct bt{
    char x;   //顶点
    At *First;   //边表头指针
}S[MAXSIZE];
//图结构
typedef struct{
    S s;    //顶点的实例化对象
    int vexnum,edgnum;//顶点数量和边数量
}ct;
int locateVex(ct G,char v){
    for(int i=0;i<G.vexnum;i++)
    {
        if(G.s[i].x==v)return i;
    }
    return -1;
}
void Creatgraph(ct &G,int &err){
     cin>>G.vexnum>>G.edgnum;
    for(int i=0;i<G.vexnum;i++){
        cin>>G.s[i].x;
        G.s[i].First=NULL;
    }
    
    for(int k=0;k<G.edgnum;k++){
        char v1,v2;
        cin>>v1>>v2;
        int i,j;
        i=locateVex(G,v1),j=locateVex(G,v2);
    if(i==-1||j==-1)err=1;
        else{
            At *p1=new At;
            p1->t=j;
            p1->next=G.s[i].First;
            G.s[i].First=p1;
            At *p2=new At;
            p2->t=i;
            p2->next=G.s[j].First;
            G.s[j].First=p2;
        }
    }
}
void DFS_ASgraphy(ct &G,int adj){
    cout<<G.s[adj].x<<" ";
    a[adj]=1;
    At *p=G.s[adj].First;
    while(p!=NULL){
        if(a[p->t]!=1)
            DFS_ASgraphy(G,p->t);
        p=p->next;
    }
}
int main(){
   ct G;
    int err=0;
    char start;
    Creatgraph(G,err);
    cin>>start;
    int adj=locateVex(G,start);
    if(adj==-1||start==1)cout<<"error";
    else{
    DFS_ASgraphy(G,adj);
    }
    return 0;
}

7-2 迪杰斯特拉方法实现最短路径

#include<bits/stdc++.h>
using namespace std;
#define THEMAX 100     //顶点的最大个数
#define MAXINT 32367
int S[THEMAX];//为各个顶点配置一个标记值,用于确认该顶点是否已经找到最短路径
int Path[THEMAX],D[THEMAX];
typedef struct{
    int vex[THEMAX];//存储图中顶点数据
    int arc[THEMAX][THEMAX];//二维数组,记录顶点之间的关系
    int vexnum,arcnum;//记录图的顶点数和弧(边)数
}AMgraph;
//根据顶点本身数据,判断出顶点在二维数组中的位置
int locateVex(AMgraph G,int v){
    for(int i=0;i<G.vexnum;i++){
        if(G.vex[i]==v)return i;
    }
    return -1;
}
//构造无向有权图
void CreatGraph(AMgraph &G,int &err){
    cin>>G.vexnum>>G.arcnum;
    for(int i=0;i<G.vexnum;i++)
        for(int j=0;j<G.vexnum;j++)
            G.arc[i][j]=MAXINT;
    for(int i=0;i<G.vexnum;i++){
        cin>>G.vex[i];
    }
    for(int k=0;k<G.arcnum;k++){
        int v1,v2,W;
        cin>>v1>>v2>>W;
        int i,j;
        i=locateVex(G,v1),j=locateVex(G,v2);
        if(i==-1||j==-1)err=1;
        else
            G.arc[i][j]=W;
        
    }
}
//迪杰斯特拉算法,v0表示有向网中起始点所在数组中的下标
void ShortPath(AMgraph G,int v0){
      //对各数组进行初始化
    for(int v=0;v<G.vexnum;v++){
        S[v]=0;
        D[v]=G.arc[v0][v];
        if(D[v]<MAXINT)Path[v]=v0;
        else Path[v]=-1;
    }
    //由于以v0位下标的顶点为起始点,所以不用再判断
    S[v0]=1,D[v0]=0;
    for(int k=0;k<G.vexnum-1;k++){
        int wmin=MAXINT,vmin;
        //选择到各顶点权值最小的顶点,即为本次能确定最短路径的顶点
        for(int w=0;w<G.vexnum;w++){
            if(!S[w]&&D[w]<wmin){
                vmin=w;
                wmin=D[w];
            }
        }
        S[vmin]=1;//设置该顶点的标志位为1,避免下次重复判断
          //对v0到各顶点的权值进行更新
        for(int i=0;i<G.vexnum;i++){
            if(!S[i]&&(D[vmin]+G.arc[vmin][i])<D[i]){
                D[i]=D[vmin]+G.arc[vmin][i];
                Path[i]=vmin;//记录各个最短路径上存在的顶点
            }
        }
    }
}
int main(){
    AMgraph G;
    int err=0;
    int v0,ve;
    CreatGraph(G,err);
    cin>>v0>>ve;
    int i=locateVex(G,v0),j=locateVex(G,ve);
    if(i!=-1&&j!=-1){
        ShortPath(G,i);
        int adj[MAXINT],k=1;
        adj[0]=j;
        while(Path[j]!=i){
            adj[k]=Path[j];
            j=Path[j];
            ++k;
        }
        adj[k]=i;
        for(int n=k;n>=0;--n){
            if(n!=0){
                cout<<G.vex[adj[n]]<<"-->";
            }else{
                cout<<G.vex[adj[n]];
            }
        }
    }
    return 0;
}

 

标签:02,Java,THEMAX,int,locateVex,顶点,adj,First
From: https://www.cnblogs.com/bzsc/p/17888666.html

相关文章

  • java 方法
    一、方法概述 二、方法定义和调用1、方法定义 2、方法调用3、带参方法定义 4、带参方法调用 5、形参和实参 6、带返回值方法的定义 7、带返回值方法的调用8、方法的注意事项 9、方法的通用格式 三、方法重载1、概述2、特点 四、方法......
  • 秦疆的Java课程笔记:64 面向对象 构造器详解
    类中的构造器也称为构造方法,世在进行创建对象的时候必须要调用的。并且构造器有以下两个特点必须和类的名字相同必须没有返回类型,也不能写void构造器必须掌握!一个类即使什么也没写,也会存在一个方法//写一个空的Person类=========================publicclassPer......
  • 我的2023技术总结
    做的项目使用.NET6的那个服务断断续续写了一年时间使用WPF、Winform、CefSharp开发的可切换谷歌IE内核的浏览器,断断续续写了大半年时间大数据服务维护使用Leaflet开发电子地图的功能,今年做了正经的前后端分离的项目(以前是按自己的方式搞的一套),前端是Vue年末做了一个ThreeJ......
  • 第七届全国计算生物学与生物信息学学术会议暨人工智能与生物医学信息学大会(NCCBB2021
    第七届全国计算生物学与生物信息学学术会议暨人工智能与生物医学信息学大会(NCCBB2021)是由中国生物工程学会计算生物学与生物信息学专业委员会联合上海交通大学、滨州医学院、中国交叉科学学会等单位共同主办的全国性计算生物学和生物信息学领域的高水平学术会议,每年举办一次。第七......
  • 2023-12-8
    <template><el-containerstyle="height:100%;"><el-asidewidth="200px"style="background-color:rgb(238,241,246);height:100%;"><el-menu:default-openeds="['1','3'......
  • java.util.concurrent.RejectedExecutionException异常分析
    感谢:https://blog.csdn.net/wzy_1988/article/details/38922449核心池和最大池的大小graphTBA("提交新任务")-->G{"maximumPoolSize设置为<br/>无界值<br/>(例如:Integer.MAX_VALUE)"}G---|"无界值"|H["允许线程池适应任意数量的并发任务"]G---|"......
  • CCF生物信息学前沿科学系列论坛暨2021年生物信息学广州高端论坛 广州,2021年4月16日-
      http://www2.scut.edu.cn/_upload/tpl/08/ae/2222/template2222/main.htm   CCF生物信息学前沿科学系列论坛暨2021年生物信息学广州高端论坛广州,2021年4月16日-18日        宏观影像组学的快速发展和微观多组学的成功应用极大的推动影像基因组学研究。......
  • java使用Ffmpeg合成音频和视频
    1、Maven依赖<!--需要注意,javacv主要是一组API为主,还需要加入对应的实现--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.6</version>&......
  • java-导出pdf
    前言:  纯代码画pdf格式<!--iTextPDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version></......
  • ISCTF2023
    ISCTF2023Misc签到题公众号发送:小蓝鲨,我想打ctfISCTF{W3lcom3_7O_2023ISCTF&BlueShark}你说爱我?尊嘟假嘟你说爱我替换.,真嘟替换!假嘟替换?,Ook!在线解码base64解码ISCTF{9832h-s92hw-23u7w-2j8s0}杰伦可是流量明星直接strings搜flag,替换为ISCTF{}ISCTF{wddhr836459_83......