比赛 |
防止颓废的小练习v0.1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
文化之旅 |
最终得分 |
100 |
用户昵称 |
Rapiz |
运行时间 |
0.018 s |
代码语言 |
C++ |
内存使用 |
0.36 MiB |
提交时间 |
2016-10-17 13:44:33 |
显示代码纯文本
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#define file(x) "culture."#x
using std::min;
using std::queue;
const int MAXK=105,MAXN=105;
int n,k,m,d[MAXN][MAXN],s,t,c[MAXN],ans=1<<30;
bool dy[MAXN][MAXN];
struct NODE{
bool pc[MAXK];
int dis,u;
NODE(int iu,int idis){memset(this,0,sizeof(*this));u=iu,dis=idis;}
};
queue<NODE> q;
int main(){
freopen(file(in),"r",stdin);
freopen(file(out),"w",stdout);
scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
for(int i=1;i<=n;i++) scanf("%d",&c[i]);
int tmp;
for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) scanf("%d",&tmp),dy[i][j]=tmp;
for(int i=1;i<=m;i++) {
int u,v;
scanf("%d%d%d",&u,&v,&tmp);
if(!d[u][v]) d[u][v]=d[v][u]=tmp;
else d[u][v]=d[v][u]=min(d[u][v],tmp);
}
{
int asd=s;
s=t;
t=asd;
}
NODE u(s,0);
u.pc[c[s]]=1;
q.push(u);
while(!q.empty()){
u=q.front();q.pop();
if(u.u==t) {
ans=min(ans,u.dis);
continue;
}
if(u.dis>ans) continue;
for(int v=1;v<=n;v++) if(d[u.u][v]&&!u.pc[c[v]]){
bool f=0;
for(int j=1;j<=k;j++) if(u.pc[j]&&dy[c[v]][j]) {
f=1;
break;
}
if(f) continue;
NODE nu=u;
nu.pc[c[v]]=1;
nu.dis+=d[u.u][v];
nu.u=v;
q.push(nu);
}
}
printf("%d",ans==1<<30?-1:ans);
}