PAT甲级A1163 Dijkstra Sequence
一道关于迪杰斯特拉算法的题目
思路:
要查询几次就使用几次dijkstra算法。将输入结点顺序看是否前面的最短路径大于后面的最短路径,大于则不是dijkstra顺序
AC代码如下:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1005;
const int inf=0x3fffffff;
int G[maxn][maxn];
bool visit[maxn];
int dis[maxn];
int n,m,k;
int main(){
scanf("%d%d",&n,&m);
int a,b,c;
fill(G[0],G[0]+maxn*maxn,inf);
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
G[a][b]=G[b][a]=c;
}
scanf("%d",&k);
for(int i=0;i<k;i++){
vector<int>v(n+1);
fill(dis,dis+maxn,inf);
fill(visit,visit+maxn,0);
for(int j=1;j<=n;j++){
scanf("%d",&v[j]);
}
dis[v[1]]=0;
for(int i1=0;i1<n;i1++){
int u=-1,minn=inf;
for(int j=1;j<=n;j++){
if(visit[j]==false&&dis[j]<minn){
u=j;
minn=dis[j];
}
}
if(u==-1)break;
visit[u]=true;
for(int v=1;v<=n;v++){
if(visit[v]==false&&dis[u]+G[u][v]<dis[v]){
dis[v]=dis[u]+G[u][v];
}
}
}
bool flag=true;
for(int i1=1;i1<n;i1++){
if(dis[v[i1]]>dis[v[i1+1]]){
flag=false;
break;
}
}
if(flag)printf("Yes\n");
else printf("No\n");
}
return 0;
}