2022.2.15

今天看了啊哈算法最小生成树 Kruskal算法,然后写题

就是先把边按权值排序,然后从小到大依次选出这个边的两个顶点看他俩是否会形成一个环,这样可以保证每次选的边都是最小的,这里就可以用并查集来合并,判断它是不是会形成环,一直循环这个过程,然后直到找完N-1条边为止,如果没有这么多条边,就不连通

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz

输入格式

第一行包含两个整数 N,MN,M,表示该图共有 NN 个结点和 MM 条无向边。

接下来 MM 行每行包含三个整数 X_i,Y_i,Z_iXi​,Yi​,Zi​,表示有一条长度为 Z_iZi​ 的无向边连接结点 X_i,Y_iXi​,Yi​。

输出格式

如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz

输入输出样例

输入 #1复制

4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3

输出 #1复制

7

说明/提示

数据规模:

对于 20\%20% 的数据,N\le 5N≤5,M\le 20M≤20。

对于 40\%40% 的数据,N\le 50N≤50,M\le 2500M≤2500。

对于 70\%70% 的数据,N\le 500N≤500,M\le 10^4M≤104。

对于 100\%100% 的数据:1\le N\le 50001≤N≤5000,1\le M\le 2\times 10^51≤M≤2×105,1\le Z_i \le 10^41≤Zi​≤104。

Kruskal算法

#include<bits/stdc++.h>
using namespace std;
const int n = 200001;
int N, M;
int f[n];

struct node{
    int a, b, v;
}eg[n];

bool cmp(node w, node e)
{
    return w.v < e.v;
}

int getf(int q)
{
    if(f[q] == q) return q;
    else return getf(f[q]);
}

int Merge(int w,int e)
{
    int t1 = getf(w);
    int t2 = getf(e);
    if(t1 != t2){
        f[t1] = t2;
        return 1;
    }
    else return 0;
}

int main()
{
    cin >> N >> M;
    for(int i = 1; i <= N; i++)
        f[i] = i;
    int sum = 0, t = 0;
    for(int i = 1; i <= M; i++)
        cin >> eg[i].a >> eg[i].b >> eg[i].v;
    sort(eg + 1, eg + M + 1, cmp);
    for(int i = 1; i <= M; i++){
        if(Merge(eg[i].a, eg[i].b)){
            sum += eg[i].v;
            t++;
        }
        if(t == N-1) break;
    }
    if(t == N-1)
        cout << sum << endl;
    else cout << "orz" << endl;

   // for(int i = 1; i <= M; i++)
     //   cout << eg[i].a << eg[i].b << eg[i].v << endl;

    return 0;
}

P2121 拆地毯

Kruskal算法,它要最大值,就边按从大到小排序

#include<bits/stdc++.h>
using namespace std;
const int N = 100001;
int n, m, k;
int f[N];

struct node{
    int a, b, v;
}eg[N];

bool cmp(node a, node b)
{
    return a.v > b.v;
}

int getf(int v){
    if(f[v] == v) return v;
    else{
        f[v] = getf(f[v]);
        return f[v];
    }
}

int Merge(int w, int e)
{
    int t1 = getf(w);
    int t2 = getf(e);
    if(t1 != t2){
        f[t1] = t2;
        return 1;
    }
    else return 0;
}

int main()
{
    cin >> n >> m >> k;
    for(int i = 1; i <= m; i++){
        cin >> eg[i].a >> eg[i].b >> eg[i].v;
    }
    sort(eg + 1, eg + m + 1,cmp);
    int sum = 0, t = 0;
    for(int i = 1; i <= n; i++)
        f[i] = i;
    for(int i = 1; i <= n; i++){
        if(Merge(eg[i].a, eg[i].b)){
            sum += eg[i].v;
            t++;
        }
        if(t == k) break;
    }
    cout << sum << endl;
}

P1195 口袋的天空

还是Kruskal算法

#include<bits/stdc++.h>
using namespace std;
const int n = 100010;
int N, M, K;
int f[n];

struct node{
    int a, b, v;
}eg[n];

bool cmp(node a, node b)
{
    return a.v < b.v;
}

int getf(int w)
{
    if(f[w] == w) return w;
    else return getf(f[w]);
}

int Merge(int w, int e)
{
    if(getf(w) != getf(e)){
        f[getf(w)] = getf(e);
        return 1;
    }
    else return 0;
}

int main()
{
    cin >> N >> M >> K;
    for(int i = 1; i <= N; i++)
        f[i] = i;
    for(int i = 1; i <= M; i++){
        cin >> eg[i].a >> eg[i].b >> eg[i].v;
    }
    sort(eg + 1, eg + M + 1, cmp);
    int sum = 0, t = 0;
    for(int i = 1; i <= M; i++){
        if(Merge(eg[i].a, eg[i].b)){
            sum += eg[i].v;
            t++;
        }
        if(t == N - K) break;
    }
    if(t == N - K) cout << sum << endl;
    else cout << "No Answer" << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 首先,打开Eclipse IDE,选择“File”菜单,然后选择“New”和“Dynamic Web Project”。 2. 在“New Dynamic Web Project”对话框中,输入项目名称和目标运行时环境(例如Tomcat),然后单击“Next”。 3. 在“New Dynamic Web Project”对话框的“Configuration”选项卡中,选择“Generate web.xml deployment descriptor”选项,然后单击“Finish”。 4. 在Eclipse IDE中,右键单击项目名称,选择“New”和“Servlet”。 5. 在“New Servlet”对话框中,输入Servlet名称和包名称,然后单击“Next”。 6. 在“New Servlet”对话框的“Configuration”选项卡中,选择“Generate comments”选项,然后单击“Finish”。 7. 在Eclipse IDE中,右键单击项目名称,选择“New”和“JSP”。 8. 在“New JSP File”对话框中,输入JSP文件名称和包名称,然后单击“Finish”。 9. 在Eclipse IDE中,右键单击项目名称,选择“Properties”和“Java Build Path”。 10. 在“Java Build Path”对话框中,选择“Libraries”选项卡,然后单击“Add Library”。 11. 在“Add Library”对话框中,选择“Server Runtime”选项,然后单击“Next”。 12. 在“Add Library”对话框中,选择目标运行时环境(例如Tomcat),然后单击“Finish”。 13. 在Eclipse IDE中,右键单击项目名称,选择“Run As”和“Run on Server”。 14. 在“Run on Server”对话框中,选择目标运行时环境(例如Tomcat),然后单击“Finish”。 15. 在浏览器中输入http://localhost:808/项目名称/,即可访问Java Web项目。 ### 回答2: 2022年1月创建Java Web项目时,我们需要首先了解Java Web开发的基本架构和技术栈。 首先,我们需要选择一个Web框架,如Spring MVC、Struts2等。其中,Spring MVC较为流行,它能够帮助我们快速搭建Java Web应用程序,并提供了一整套的解决方案,包括依赖注入、AOP等。 其次,我们需要选择一个MVC模式的数据库访问框架,如MyBatis、Hibernate等。MyBatis是一个轻量级、易于使用的ORM框架,它能够灵活地映射Java对象到SQL语句,实现对象化的数据库访问。Hibernate也是一个常用的ORM框架,它能够让我们使用面向对象的方式访问数据库,提高了代码的可读性和可维护性。 此外,我们需要选择一个Java Web服务器,如Tomcat、Jetty等。Tomcat是Apache软件基金会开发的Java Web应用服务器,它支持Servlet、JSP等Java Web标准,并提供了一些常用的扩展。 最后,我们需要选择一个开发工具,如Eclipse、IntelliJ IDEA等。Eclipse是一个功能齐全的开发工具,支持Java、Web、数据库等领域。IntelliJ IDEA是一款功能强大的Java开发工具,支持众多框架和技术。 在创建Java Web项目时,我们需要遵循MVC模式,将业务逻辑、数据访问、用户界面分别封装在不同的组件中,实现代码的高内聚、低耦合。同时,我们需要注意安全性、性能等方面的问题,确保项目的稳定、可靠、高效。 总之,Java Web开发需要综合运用多种技术和工具,也需要不断学习和探索。希望我的回答对你有所帮助。 ### 回答3: JAVA WEB项目能够快速搭建、高效性能、稳定性强、跨平台支持丰富,深受广大开发者青睐。然而,在创建JAVA WEB项目的时候,需要涉及多个环节,需要谨慎处理。以下是创建一个JAVA WEB项目的步骤: 1、选择开发工具:Eclipse、IntelliJ IDEA是非常不错的JAVA WEB开发工具,如果您在学习JAVA WEB开发,开发经验不足,建议使用Eclipse,其用户体验是相对更好的;若您是有一定经验的JAVA WEB开发工程师,建议使用IntelliJ IDEA,它有强大的代码补齐和代码自动排版等优秀特性。 2、创建一个新的Web项目:打开Eclipse或IntelliJ IDEA,点击“新建”按钮,创建一个新的JAVA WEB项目,在这里可以填写项目名称、项目路径、JDK等信息,此处需要妥善设置。 3、导入所需的JAR包:完成第二步后,在项目中可能需要导入一些外部的依赖,如JSTL基础标签库、Servlet API等jar包,可以通过Maven管理依赖,避免手动下载与配置。 4、配置Web.xml文件:Web.xml文件是JAVA WEB项目的核心配置文件,可以在其中添加Servlet、Filter、Listener等来处理请求和响应。需要注意的是,Web.xml文件中对应的servlet、filter、url-pattern等节点都要正确配对,否则会导致项目运行出错。 5、编写页面和代码:在完成上述的环节后,开始编写前端页面和后端代码,思考如何完成所需的业务功能,接收前端请求,处理后端逻辑,输出结果。 6、部署到WEB服务:部署的方式有多种,如Tomcat、Jetty等,也可以在IDEA中直接点击运行,将项目部署到内置的WEB服务器中。具体的部署方式因开发者的使用环境和个人喜好而异,各种方式均可。 在创建JAVA WEB项目时,以上几个步骤可以让我们更加轻松地完成项目搭建,并在代码编写的过程中完成优化和调试等环节。需要注意的是,不仅需要关注JAVA WEB项目中的技术,也需要考虑到开发周期、开发质量、以及代码规范和用户体验等方面,让项目更加完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值