版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}