PAT 1163 Dijkstra Sequence
思路:在寻找单源最短路径的过程中,与提供的序列各项比较。
#include<bits/stdc++.h>
using namespace std;
const int inf=99999999;
int e[1001][1001],n;
vector<int> temp;
bool visit[1001];
int dis[1001];
bool dijkstra(int start){
dis[start]=0;
for(int i=1;i<=n;i++){
int minn=inf,v=-1;
for(int j=1;j<=n;j++){
if(visit[j]==false&&dis[j]<inf){
if(dis[j]<minn){
minn=dis[j];
v=j;
}else if(dis[j]==minn&&j==temp[i-1]){//与序列进行比较
v=j;
}
}
}
if(v==-1) break;
if(v!=temp[i-1]) return false; //如果不等序列相应值,则序列有误。
visit[v]=true;
for(int j=1;j<=n;j++){
if(visit[j]==false&&e[v][j]<inf){
if(dis[j]>dis[v]+e[v][j]){
dis[j]=dis[v]+e[v][j];
}
}
}
}
return true;
}
int main()
{
int m;
cin>>n>>m;
temp.resize(n);
fill(e[0],e[0]+1001*1001,inf);
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
e[a][b]=e[b][a]=c;
}
int k;
cin>>k;
for(int i=0;i<k;i++){
for(int j=0;j<n;j++) cin>>temp[j];
fill(visit,visit+1001,false);
fill(dis,dis+1001,inf);
if(dijkstra(temp[0])) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}```