1150 Travelling Salesman Problem (25 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lianwaiyuwusheng/article/details/87857591

问题描述:给定第一个无向图和一些路径,判断该路径的类型。简单回路(访问每一个结点),回路,不是回路

解题思路:根据所给路径依次访问即可,是否可达,结点是否被访问和重复访问,更新最短路径

AC代码:

/*
**1150 Travelling Salesman Problem (25 分)----------25
**给定一个图以及一条路径,判断路径类型
**#图直接用邻接矩阵储存,然后根据路径对访问,记录该点@1是否可达,@2是否被访问。@3更新最小路径
*/
#include<iostream>
#include<cstring>
using namespace std;
#define INF 0x1ffffff
#define MAX 210
int gra[MAX][MAX];
bool vis[MAX];
int main()
{
    freopen("test.txt","r",stdin);
    int N,M,K,i,j,c1,c2,d,tag,cnt,m;
    scanf("%d %d",&N,&M);
    for(i=1;i<=N;++i){
        for(j=1;j<=N;++j)gra[i][j]=INF;
    }
    while(M--){
        scanf("%d %d %d",&c1,&c2,&d);
        gra[c1][c2]=gra[c2][c1]=d;
    }
    scanf("%d",&K);
    j=0;m=INF;
    for(i=1;i<=K;++i){
        printf("Path %d: ",i);
        memset(vis,0,N+1);d=0;tag=0;cnt=0;
        scanf("%d %d",&M,&c1);
        while(--M){
            scanf("%d",&c2);
            if(gra[c1][c2]<INF||tag==2){
                if(!vis[c2])vis[c2]=1,++cnt;//被访问点的数目
                else tag=1;
                d+=gra[c1][c2];
                c1=c2;
            }else tag=2;//不可达
        }
        if(tag!=2)printf("%d ",d);
        else printf("NA ");
        if(cnt==N&&tag==0)printf("(TS simple cycle)\n");//无重复访问点
        else if(tag==1&&cnt==N)printf("(TS cycle)\n");//有重复访问点
        else printf("(Not a TS cycle)\n");
        if(tag!=2&&cnt==N&&m>d)j=i,m=d;
    }
    printf("Shortest Dist(%d) = %d",j,m);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lianwaiyuwusheng/article/details/87857591
今日推荐