#include<bits/stdc++.h>
using namespace std;
int dmin[1010];
int d[1010][1010];
bool isvis[1010] = { false };
vector<int> vl[1010];
int vn, ve;
int main() {
cin >> vn >> ve;
for (int i = 0; i < ve; i++) {
int a, b, c;
cin >> a >> b >> c;
d[a][b] = d[b][a] = c;
vl[a].push_back(b);
vl[b].push_back(a);
}
int test;
cin >> test;
for (int i = 0; i < test; i++) {
vector<int> v;
int flag = 0;
for (int j = 0; j < vn; j++)
{
int a;
cin >> a;
v.push_back(a);
}
int allmin = 9999999;
vector<int> s; //记录当前集合,第一个元素无论如何都正确
s.push_back(v[0]);
fill(isvis, isvis + 1010, false);
isvis[v[0]] = true;
for (int i = 1; i < vn; i++) { //有n-1个元素需要判断,执行n-1次
int min1 = 9999, u = -1;
vector<int> res;
for (int o = 0; o < s.size(); o++) { //找出当前集合中最近的所有点
int now1 = s[o];
for (int j = 0; j < vl[s[o]].size(); j++) {
int now2 = vl[now1][j];
if (d[now1][now2] < min1 && isvis[now2] == false) {
min1 = d[now1][now2];
res.clear();
res.push_back(now2);
}
else if (d[now1][now2] == min1 && isvis[now2] == false)
res.push_back(now2);
}
}
int p;
for (p = 0; p < res.size(); p++) { //判断输入序列的当前元素是否匹配
if (v[i] == res[p]) {
flag = 1;
isvis[v[i]] = true;
s.push_back(v[i]);
break;
}
}
if (p == res.size()) flag = 0;
if (flag == 0) { //只要有一个元素不满足,那么就直接say no
cout << "No" << endl;
break;
}
}
if (flag == 1) cout << "Yes" << endl;
}
}
模拟dijikstra选节点
最新推荐文章于 2024-07-15 22:10:26 发布