一个旅游景点,如果被带火了的话,就被称为“网红点”。大家来网红点游玩,俗称“打卡”。在各个网红点打卡的快(省)乐(钱)方法称为“攻略”。你的任务就是从一大堆攻略中,找出那个能在每个网红点打卡仅一次、并且路上花费最少的攻略。
输入格式:首先第一行给出两个正整数:网红点的个数 N(15) 2 + (5->1) 2 + (1->4) 2 + (4->3) 2 + (3->6) 2 + (6->2) 2 + (2->0) 2 = 14;
第 5 条攻略的总路费同理可算得:1 + 1 + 1 + 2 + 3 + 1 + 2 = 11,是一条更省钱的攻略;
第 7 条攻略的总路费同理可算得:2 + 1 + 1 + 2 + 2 + 2 + 1 = 11,与第 5 条花费相同,但序号较大,所以不输出。
分析:在Edge[u][v]中存储u到v的花费,在每一次询问中,Path中储存攻略路径,因为起始和终点都要为0号点,所以将 Path[0] 与Path[N + 1] 置为0~判断攻略中城市数n与总城市数N是否相等,如果不相等则不满足要求~
Has[i]标记第i个点是否出现过,如果出现过2次,那么也是不满足要求~
之后判断路径上两点之间是否有边相连,没有的话也表示改路径不合法,有的话就用累加到cost中~Ansnum表示总的合法路径,Ansid记录最少划分路径的编号,Anscost记录最少划分路径的费用~
C++1234567891011121314151617181920212223242526272829303132333435#include using namespace std;int N, M, K, u, v, w, n, flag, cost, Ansnum, Ansid, Anscost = INT_MAX, Edge[201][201], Path[202], Has[201];int main() { cin >> N >> M; for (int i = 0; i > u >> v >> w; Edge[u][v] = Edge[v][u] = w; } cin >> K; for (int i = 1; i > n; for (int j = 1; j > Path[j]; if(Has[Path[j]]) Has[0] = 1; Has[Path[j]] = 1; } if (Has[0] || n != N) continue; for (int j = 1; j