第一次:不优化直接上,76分,8、9、10TLE
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <queue>
#include <list>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
using namespace std;
int N,K,M,S,T;
int C[105],B[105][105];
int mapp[105][105];
int visit[105][105];
struct pos{
int now;
int steps;
friend bool operator<(const pos &a,const pos &b){
return a.steps>b.steps;
}
};
int main(){
cin>>N>>K>>M>>S>>T;
for(int i=1;i<=N;i++){
scanf("%d",&C[i]);
}
for(int i=1;i<=K;i++){
for(int j=1;j<=K;j++){
scanf("%d",&B[i][j]);
}
}
int u,v,d;
for(int i=1;i<=M;i++){
cin>>u>>v>>d;
if(mapp[u][v]==0 || mapp[u][v]>d){
mapp[u][v]=d;
}
if(mapp[v][u]==0 || mapp[v][u]>d){
mapp[v][u]=d;
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(B[C[i]][C[j]]==1){
mapp[j][i]=0;
}
}
}
if(C[S]==C[T]){
cout<<"-1";
return 0;
}
priority_queue<pos> q;
pos cnt,next;
cnt.now=S;
cnt.steps=0;
q.push(cnt);
while(!q.empty()){
cnt=q.top();
q.pop();
if(cnt.now==T){
cout<<cnt.steps;
return 0;
}
for(int i=1;i<=N;i++){
if(mapp[cnt.now][i]!=0){
next.now=i;
next.steps=cnt.steps+mapp[cnt.now][i];
q.push(next);
next=cnt;
}
}
}
cout<<"-1";
}
第二次,优化,44分,3~9WA
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <queue>
#include <list>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
using namespace std;
int N,K,M,S,T;
int C[105],B[105][105];
int mapp[105][105];
bool visit[105];
struct pos{
int now;
int steps;
friend bool operator<(const pos &a,const pos &b){
return a.steps>b.steps;
}
};
int main(){
cin>>N>>K>>M>>S>>T;
for(int i=1;i<=N;i++){
scanf("%d",&C[i]);
}
for(int i=1;i<=K;i++){
for(int j=1;j<=K;j++){
scanf("%d",&B[i][j]);
}
}
int u,v,d;
for(int i=1;i<=M;i++){
cin>>u>>v>>d;
if(mapp[u][v]==0 || mapp[u][v]>d){
mapp[u][v]=d;
}
if(mapp[v][u]==0 || mapp[v][u]>d){
mapp[v][u]=d;
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(B[C[i]][C[j]]==1){
mapp[j][i]=0;
}
}
}
if(C[S]==C[T]){
cout<<"-1";
return 0;
}
priority_queue<pos> q;
pos cnt,next;
cnt.now=S;
cnt.steps=0;
q.push(cnt);
visit[S]=1;
while(!q.empty()){
cnt=q.top();
q.pop();
if(cnt.now==T){
cout<<cnt.steps;
return 0;
}
for(int i=1;i<=N;i++){
if(mapp[cnt.now][i]!=0 && visit[i]==0){
next.now=i;
next.steps=cnt.steps+mapp[cnt.now][i];
q.push(next);
visit[i]=1;
next=cnt;
}
}
}
cout<<"-1";
}