2020-PTA总决赛-L2-4 网红点打卡攻略(基础建图+测试点2)
题目怎么说就怎么做,没什么坑,我看最多就200个点,干脆就二维数组建个图得了。。。多了要邻接表
注意加上从家出发和回家的路费,和不能去重复的地方打卡
可能存在两条路不互通的策略,注意判断(测试点2)
AcCode:
#include<bits/stdc++.h>
using namespace std;
int graph[210][210]; //最多200个点,不用邻接表了
struct Node{
int pid; //策略号
int price; //策略的花费
};
vector<Node> res;
int main(){
int N, M, min = 0x7fffffff; //0x7fffffff是int的最大值,即0111 1111 1111...共31个1
cin >> N >> M;
while(M--){
int v1, v2, spend;
cin >> v1 >> v2 >> spend;
graph[v1][v2] = spend;
graph[v2][v1] = spend;
}
int K;
cin >> K;
for(int i = 1; i <= K; i++){
int pCnt, sum = 0;
bool vis[210] = {false}, flag = false;
cin >> pCnt;
int be = 0;
for(int i = 0; i < pCnt; i++){
int v;
cin >> v;
if((i == pCnt - 1 && !graph[v][0]) || !graph[v][be] || vis[v] || pCnt != N) flag = true;
sum += graph[be][v];
vis[v] = true;
be = v;
}
sum += graph[be][0];
if(flag) continue;
if(sum < min) min = sum;
res.push_back({i, sum});
//cout << i << endl;
}
cout << res.size() << endl;
for(int i = 0; i < res.size(); i++){
if(res[i].price == min){ //按顺序添加的,找到第一个就成功了。
cout << res[i].pid << " " << res[i].price;
return 0;
}
}
return 0;
}