题目
通过本道题复习一下dijkstra算法,这也算是本菜鸡第一次不靠死记硬背的模板过题目了,也复习一下fill()函数对于初始化二维数组的用法。因为点的数量不多,所以选择了邻接矩阵的写法。
#include <bits/stdc++.h>
using namespace std;
const int MAXV=1010;
const int INF=0x3fffffff;
int nv, ne;
int edge[MAXV][MAXV], ver[MAXV], vis[MAXV], dis[MAXV];
bool dijkstra(int st) {
fill(dis, dis+MAXV, INF);
fill(vis, vis+MAXV, 0);
vis[st]=1;
for(int i=1; i<=nv; i++){
if(edge[st][i])
dis[i]=edge[st][i];
}
for(int k=1; k<nv; k++){
int path=INF, u=-1, judge=false;
for(int i=1; i<=nv; i++){
if(!vis[i] && path>dis[i]){
u=i;
path=dis[i];
}
}
for(int i=1; i<=nv; i++){
if(!vis[i] && dis[i]==path && i==ver[k]){
u=i;
judge=true;
}
}
if(!judge)
return false;
vis[u]=1;
for(int i=1; i<=nv; i++){
if(!vis[i] && edge[u][i] && dis[u]+edge[u][i]<dis[i]){
dis[i]=dis[u]+edge[u][i];
}
}
}
return true;
}
int main()
{
int st, ed, w;
fill(edge[0], edge[0]+MAXV*MAXV, 0);
scanf("%d%d", &nv, &ne);
for(int i=1; i<=ne; i++){
scanf("%d%d%d", &st, &ed, &w);
edge[st][ed]=edge[ed][st]=w;
}
int k;
scanf("%d", &k);
while(k--){
for(int i=0; i<nv; i++)
scanf("%d", &ver[i]);
if(dijkstra(ver[0]))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}