pat-1150

除了逻辑复杂一些其他的也没啥要想全面  分阶段 如果约束是层层叠加的 由宏入微,不要直接考虑每个细节,有可能考虑的不全面 

#include<iostream>
#include<set>
#include<vector>
using namespace std;
//先将要输入的变量分为全局的和局的区别
int n,edge;
int a[300][300]={0};
//一开始有一个测试点没过 是因为初始的ans值设的9999导致太小了,最小的值都比他大200*100要根据题干大致算一个上界,至少要比这个大(注意) 
int ans=99999999,ansindex;

void check(int index)
{   bool flag=true;
    int sum=0;
	int tempk;
	cin>>tempk;
	set<int> pr;
	//因为vector 也要更新,多个样例 
	vector<int> v(tempk);
	for(int i=0;i<tempk;i++)
	  {scanf("%d",&v[i]);
        pr.insert(v[i]) ; }
	for(int i=0;i<tempk-1;i++)
	{    //二维数组索引写错 a[][]注意 
		if(a[v[i]][v[i+1]]==0) {
		flag=false;}
        sum+=a[v[i]][v[i+1]];		 
	}
	if(!flag) printf("Path %d: NA (Not a TS cycle)\n",index);
	else if(v[0]!=v[tempk-1]||pr.size()!=n) printf("Path %d: %d (Not a TS cycle)\n",index,sum);
	else if(tempk>n+1) {
	       printf("Path %d: %d (TS cycle)\n",index,sum);
	       if(sum<ans)
	       { ans=sum;
	       ansindex=index;
	       }
    }
    else if(tempk==n+1)
    {  printf("Path %d: %d (TS simple cycle)\n",index,sum);
       if(sum<ans)
	       { ans=sum;
	       ansindex=index;
	       }
    	
	}
 }
 int main()
 {
 	cin>>n>>edge;
 	for(int i=0;i<edge;i++)
 	{ int  l1,l2,dist;
 	  cin>>l1>>l2>>dist;
 	  a[l1][l2]=a[l2][l1]=dist;
	 }
	 int numm;cin>>numm;
	 for(int i=1;i<=numm;i++)
	 check(i);
	 printf("Shortest Dist(%d) = %d\n",ansindex,ans);
	 return 0;
 }
  

总结:

1. //二维数组索引写错 a[][](注意) 

2.//因为vector 也要更新,多个样例 所以直接在for循环里输入

3.//先将要输入的变量分为全局的和局部区别 局部定义在局部   局部定义在全局会导致条件没有重置上次影响这次

4.//一开始有一个测试点没过 是因为初始的ans值设的9999导致太小了,最小的值都比他大200*100要根据题干大致算一个上界,至少要比这个大(注意) 

英语:

 

问题

逻辑多种判断 先宏观分几个阶段 再到细枝末节 不要本末倒置 多训练一下 

猜你喜欢

转载自blog.csdn.net/m0_45359314/article/details/112749736