複雑なロジックを除いて、包括的であるものは何もありません。制約がマクロからミクロまでレイヤーごとに重ね合わされている場合、すべての詳細を直接考慮しないでください。不完全な場合があります。
#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.//間違った2次元配列インデックスa [] [](注)
2 .//ベクトルも更新する必要があるため、複数のサンプルがforループに直接入力されます
3 .//最初に入力する変数をグローバルとローカルに分割して、ローカルのローカル定義を区別します。グローバルのローカル定義により、条件が最後にリセットされないようになります。これに影響します。
4 .//最初は、初期のans値が9999に設定されていたために合格しなかったテストポイントがあり、小さすぎて、最小値が彼より200 * 100大きかった。大まかに計算する必要があります。質問に基づく上限、少なくともこのビッグよりも(注)
英語:
問題
論理と複数の判断は、最初に巨視的にいくつかの段階に分割され、次に詳細になります。カートを馬の前に置いて、さらに訓練しないでください。