除了逻辑复杂一些其他的也没啥要想全面 分阶段 如果约束是层层叠加的 由宏入微,不要直接考虑每个细节,有可能考虑的不全面
#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要根据题干大致算一个上界,至少要比这个大(注意)
英语:
问题
逻辑多种判断 先宏观分几个阶段 再到细枝末节 不要本末倒置 多训练一下