天梯赛L2-036 网红点打卡攻略
题目详情:
输入样例:
6 13
0 5 2
6 2 2
6 0 1
3 4 2
1 5 2
2 5 1
3 1 1
4 1 2
1 6 1
6 3 2
1 2 1
4 5 3
2 0 2
7
6 5 1 4 3 6 2
6 5 2 1 6 3 4
8 6 2 1 6 3 4 5 2
3 2 1 5
6 6 1 3 4 5 2
7 6 2 1 3 4 5 2
6 5 2 1 4 3 6
输出样例:
3
5 11
思路:
这个题目的思路很简单:就是建立一个图,然后是给几种遍历的方案,每一种方案都要求:要遍历完所有的结点,并且每个结点只能遍历一遍,最后把遍历的这些结点的边权值加到一起。
要注意的是,最后到回到原点,如果方案的最后一个结点和原点没有边,也是不可以的。
这个题目一直拿22分,第二个测试点就是过不去。也不知道哪里错了!!!好烦。最后照着一个大佬的代码改了一下过去了。但是还是不知道自己错在哪里,也没有小伙伴可以帮我一下下
详细代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200 + 5;
int m,N,sx;//sx就是序号
int mincost = 1e9 + 1;
int G[maxn][maxn];//建立图
int vec[maxn];//存方案
int visit[maxn];//存结点的访问个数
int main()
{
cin>>N>>m;
int u,v,w;
for(int i=0; i<m; i++)//建立图
{
cin>>u>>v>>w;
G[u][v] = G[v][u] = w;
}
int num =0;//满足条件的方案数
int k,n;
cin>>k;
for(int j=1; j<=k; j++)
{
int sum = 0;//每个方案的花费
cin>>n;
memset(visit,0,sizeof(visit));//每个方案的判断都要先把visit置空
for(int i=1; i<=n; i++)//输入方案
{
cin>>vec[i];
visit[vec[i]]++;
}
vec[0] = vec[n+1]=0;//先把回到原点的结点赋给vec
if(N != n)//访问的结点的数量不对
continue;
for(int i=1; i<=N; i++)
if(visit[i]!=1)//访问结点的次数不对
n--;
if(N != n)
continue;
for(int i=0; i<=n; i++)
{
if(G[vec[i]][vec[i+1]] == 0)//方案的最后一个结点和原点没有边
{
n--;
break;
}
sum += G[vec[i]][vec[i+1]];
}
if(N != n)
continue;
num++;
if(mincost > sum)
{
mincost = sum;
sx = j;
}
}
cout<<num<<endl<<sx<<" "<<mincost;
}
知识总结:
测试点2过不去的代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200 + 5;
int G[maxn][maxn];
int N,M,k;
vector<int>vec;
int visit[maxn];
int minn=0x3f3f3f3f, sx;
int main()
{
int num = 0;
cin>>N>>M;
for(int i=0; i<maxn; i++)
{
for(int j=0; j<maxn; j++)
{
G[i][j] = -1;
}
}
int u,v,w;
for(int i=0; i<M; i++)
{
cin>>u>>v>>w;
G[u][v] = G[v][u] = w;
}
cin>>k;
for(int i=1; i<=k; i++)
{
int n;
int cost = 0;
cin>>n;
vec.resize(n+2);
vec[n+1] = 0;//先把回家的赋值上去
vec[0] = 0;//先把回家的赋值上去
memset(visit,0,sizeof(visit));
for(int j=1; j<=n; j++)
{
cin>>vec[j];
visit[vec[j]]++;
}
if(n!=N)//检查是否满足条件
{
continue;
}
for(int j=1; j<=N; j++)
{
if(visit[j] != 1)
n--;
}
if(n != N)
{
continue;
}
if(G[vec[n]][0] == -1)
{
n--;
}
if( n != N)
continue;
for(int j=0; j<=n; j++)
{
cost += G[vec[j]][vec[j+1]];
}
num++;
if( minn > cost)
{
sx = i;
minn = cost;
}
}
cout<<num<<endl;
cout<<sx<<" "<<minn;
}