解题细节分析:
0.比较图的两种存储方法,通过邻接矩阵存储更便于查找给定两点之间的关系
1.注意理解清楚题义:“访问所有网红点”中所有不是指攻略中所有,而是存在的全部的网红点
代码见下:// 需要注明的是,本代码非AC代码,仍有一个测试点没有通过,如果有大佬发现问题,期待批评指正!
#include<bits/stdc++.h>
using namespace std;
#define mx 100000000
int graph[205][205];
set<int>visited;
int main()
{
int n1, m;
cin>>n1>>m;
for(int i=0; i<n1+1; i++)
{
for(int j=0; j<n1+1; j++)
{
if(i==j) graph[i][j] = 0;
else graph[i][j] = mx;
}
}
int a, b, fee;
for(int i=0; i<m; i++)
{
cin>>a>>b>>fee;
graph[a][b] = fee;
graph[b][a] = fee;
}
int k, n; cin>>k;
int cur, pre;
int total_fee = 0, min_fee=mx, index, good_strategy=0;
for(int i=1; i<=k; i++)
{
visited.clear();
total_fee = 0;
cin>>n;
if(n!=n1)
{
for(int h=0; h<n; h++) cin>>cur;
continue;
}
pre = 0;
int j=1;
for(j=1; j<=n+1; j++)
{
if(j == n+1) cur = 0;
else cin>>cur;
if(visited.count(cur))//访问过不止一次
{
for(int h=0; h<n-j; h++) cin>>cur;
break;
}
else visited.insert(cur);
if(graph[pre][cur] != mx)
{
total_fee += graph[pre][cur];
}
else{//没有通路
total_fee = mx;
for(int h=0; h<n-j; h++) cin>>cur;
break;
}
pre = cur;
}
if(j == n+2)
{
good_strategy++;
if(total_fee < min_fee)
{
min_fee = total_fee;
index = i;
}
}
}
cout<<good_strategy<<endl;
cout<<index<<" "<<min_fee;
}
反思心得:
0.审题时,记录联想到的易错细节,如(“如果这样的攻略不唯一,则输出序号最小的那个。”)
1.如果题目有测试数据的解说的话,写之前先看解说,从而更准确地把握题意。
~ 希望对你有启发!~