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.//間違った2次元配列インデックスa [] [](注) 

2 .//ベクトルも更新する必要があるため、複数のサンプルがforループに直接入力されます

3 .//最初に入力する変数をグローバルとローカルに分割して、ローカルのローカル定義を区別します。グローバルのローカル定義により、条件が最後にリセットされないようになります。これに影響します。

4 .//最初は、初期のans値が9999に設定されていたために合格しなかったテストポイントがあり、小さすぎて、最小値が彼より200 * 100大きかった。大まかに計算する必要があります。質問に基づく上限、少なくともこのビッグよりも(注) 

英語:

 

問題

論理と複数の判断は、最初に巨視的にいくつかの段階に分割され、次に詳細になります。カートを馬の前に置いて、さらに訓練しないでください。 

 

おすすめ

転載: blog.csdn.net/m0_45359314/article/details/112749736