首页 > 其他分享 >PAT甲级-1150 Travelling Salesman Problem

PAT甲级-1150 Travelling Salesman Problem

时间:2024-10-09 23:19:26浏览次数:3  
标签:cnt PAT flag1 int 1150 flag3 flag2 && Travelling

题目

 

题目大意

旅行商问题是NP-hard问题,即没有多项式时间内的解法,但是可以验证答案是否正确。给定一个无向图,判断简单环,复杂环和非环。对应“TS simple cycle”、“TS cycle”、“Not a TS cycle”。还要求出环的最小路径权值和,及对应的索引。

思路

主要思路在于如何区分简单环、复杂环和非环。

简单环的特性:首尾节点相等;连通图;包含所有顶点;没有重复边。

复杂环的特性:首尾节点相等;连通图;包含所有顶点;有重复边。

非环:除了简单环和复杂环都是非环。

对比以上特性,可以设置3个标志,flag1标志是否是简单环(不考虑连通性),flag2标志是否是复杂环(不考虑连通性),flag3标志是否为连通图。

代码

#include <iostream>
#include <vector>
#include <set>
#include <climits>
using namespace std;

int n, m, k;
int g[201][201] = {0};

int main(){
    cin >> n >> m;
    for (int i = 0; i < m; i++){
        int v1, v2, w;
        cin >> v1 >> v2 >> w;
        g[v1][v2] = w;
        g[v2][v1] = w;
    }
    cin >> k;
    int shortest = INT_MAX;  // 最小距离
    int shortIndex = 0;  // 最小距离对应的样例索引

    for (int t = 1; t <= k; t++){
        int cnt;
        cin >> cnt;
        vector<int> v(cnt);
        set<int> st;
        for (int i = 0; i < cnt; i++){
            cin >> v[i];
            st.insert(v[i]);
        }

        int flag1 = 0;  // 判断是否为简单环(不包括连通性)
        int flag2 = 0;  // 判断是否为复杂环(不包括连通性)
        int flag3 = 1;  // 判断是否连通

        if ((int)st.size() == n && v[0] == v[cnt - 1] && cnt - 1 == n){
            flag1 = 1;
        }else if ((int)st.size() == n && v[0] == v[cnt - 1]){
            flag2 = 1;
        }  // 判断flag1,flag2
        int sum = 0;
        for (int i = 0; i < cnt - 1; i++){
            if (g[v[i]][v[i + 1]] == 0){
                flag3 = 0;
                break;
            }else{
                sum += g[v[i]][v[i + 1]];
            }
        }  // 判断flag3

        if (flag1 && flag3 || (flag2 && flag3)){
            if (shortest > sum){
                shortest = sum;
                shortIndex = t;
            }
        }  // 更新最短路径及其索引

        cout << "Path " << t << ": ";
        flag3 ? cout << sum : cout << "NA";
        if (flag1 && flag3){
            cout << " (TS simple cycle)" << endl;
        }else if (flag2 && flag3){
            cout << " (TS cycle)" << endl;
        }else{
            cout << " (Not a TS cycle)" << endl;
        }
    }
    printf("Shortest Dist(%d) = %d\n", shortIndex, shortest);

    return 0;
}

标签:cnt,PAT,flag1,int,1150,flag3,flag2,&&,Travelling
From: https://blog.csdn.net/weixin_74092648/article/details/142797353

相关文章

  • PatriotCTF2024 Web Impersonate
    源码:#!/usr/bin/envpython3fromflaskimportFlask,request,render_template,jsonify,abort,redirect,sessionimportuuidimportosfromdatetimeimportdatetime,timedeltaimporthashlibapp=Flask(__name__)server_start_time=datetime.now()server_s......
  • 112. Path Sum
    GiventherootofabinarytreeandanintegertargetSum,returntrueifthetreehasaroot-to-leafpathsuchthataddingupallthevaluesalongthepathequalstargetSum.Aleafisanodewithnochildren.Example1:Input:root=[5,4,8,11,null,13,......
  • 使用apatch httpClient, 并且我用了try-with-resource, 我希望在catch 和 finally 中从
    在使用ApacheHttpClient时,如果你使用了try-with-resources语法并希望在catch或finally块中从response对象中读取完整的responseentity,你可能会遇到资源过早关闭的问题。这是因为try-with-resources会在try块结束后自动关闭资源,导致在catch或finally块中无法......
  • 那么给apatch HttpClient 加连接池,有助于解决我的问题吗
    使用连接池(connectionpool)对ApacheHttpClient的确能够提升性能,但对于你遇到的问题——在catch或finally块中读取完整的responseentity,连接池本身不会直接解决这个问题。连接池的主要作用是提升网络连接的复用效率,减少频繁建立和关闭连接的开销,从而提高应用程序的性能和......
  • 使用 Apatch HttpRequest 的情况下,使用 HttpRequest.execute 方法, 假如该方法抛出了
    在使用ApacheHttpClient时,如果调用HttpRequest.execute()抛出了异常,通常情况下,异常不会直接包含完整的responseentity。特别是当服务器返回错误响应(如4xx或5xx状态码)时,execute()方法可能抛出各种类型的IOException或HttpResponseException,但这些异常并不一定会携带......
  • [论文阅读报告] Fast 2-Approximate All-Pairs Shortest Paths, SODA '24
    本篇文章介绍\(\tildeO(n^{2.032})\)的无向无权图全源最短路stretch2近似算法和\(\tildeO(n^{\frac94})\)的组合算法,以及\(\tildeO(n^{2.214}(1/\epsilon)^{O(1)}\logW)\)的非负整数边权stretch\((2+\epsilon)\)近似算法。其中\((1/\epsilon)^{O(1)}\)......
  • [论文阅读报告] All pairs shortest paths using bridging sets and rectangular matr
    本篇文章介绍整数边权下\((\min,+)\)矩阵乘、APSP等问题的一些做法。若每个元素的权值在\([-M,M]\cap\mathbbZ\)中,\(n\timesn^r\)和\(n^r\timesn\)的\((\min,+)\)矩阵乘可做到\(\tildeO(Mn^{\omega(r)})\);有向图APSP可做到\(\tildeO(n^{2+\mu(t)})\),......
  • PAT甲级1003Emergency
    介绍寻找路径最短的种类数并输出最短路径的最多救援队数量Asanemergencyrescueteamleaderofacity,youaregivenaspecialmapofyourcountry.Themapshowsseveralscatteredcitiesconnectedbysomeroads.Amountofrescueteamsineachcityandthel......
  • [USACO23JAN] Tractor Paths P 题解
    T4[USACO23JAN]TractorPathsP唯二的两道蓝题之一,但难度至少紫黑之间。思路是这篇题解的。首先一个贪心:跳到与当前区间相连的最靠右的区间肯定是最优的,由此倍增易得第一问。重点在于第二问的求解,我们发现这个东西很麻烦,这时候就需要一些寄巧了。具体来说,前人之述备矣。坑点:D......
  • xpath解析数据
    节点的关系:父子同胞先辈后代常用路径表达式表达式描述nodename选取此节点的所有子节点/从根节点选取//从匹配选择的当前节点中选择文档的节点.获取当前节点..选取当前节点的父节点@选择属性通配符通配符描述*匹配任何元素节点......