比赛 |
ctime蒟蒻生日赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
文化之旅 |
最终得分 |
100 |
用户昵称 |
BaDBoY |
运行时间 |
0.049 s |
代码语言 |
C++ |
内存使用 |
41.03 MiB |
提交时间 |
2017-10-17 18:33:29 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int read() {
int s=0,f=1;
char ch=getchar();
for( ; ch<'0'||ch>'9'; f=(ch=='-')?(-1):f,ch=getchar()) ;
for( ; ch>='0'&&ch<='9'; s=(s<<1)+(s<<3)+(ch^48),ch=getchar()) ;
return s*f;
}
int n,k,m,st,ed,tot,r[105],cul[105],dis[105],head,tail,res[105][105];
bool dislik[105][105];
struct edge {
int to,vv,next;
} c[20001];
void add(int x,int y,int z) {
c[tot]=(edge) {
y,z,r[x]
};
r[x]=tot++;
}
struct oo {
int now;
int cul[105];
oo() {
cul[0]=0;
}
} que[100005];
void bfs() {
dis[st]=0;
que[++tail].now=st;
que[tail].cul[++que[tail].cul[0]]=cul[st];
while(head<tail) {
oo sta=que[++head];
for(int i=r[sta.now]; ~i; i=c[i].next) {
if(dis[c[i].to]>dis[sta.now]+c[i].vv) {
bool check=true;
oo ans;
for(int j=1; j<=sta.cul[0]&✓ ++j) {
ans.cul[j]=sta.cul[j];
if(dislik[cul[c[i].to]][sta.cul[j]]) {
check=false;
}
}
if(check) {
ans.now=c[i].to,ans.cul[0]=sta.cul[0]+1;
ans.cul[ans.cul[0]]=cul[c[i].to];
dis[c[i].to]=dis[sta.now]+c[i].vv;
que[++tail]=ans;
}
}
}
}
}
void bfs2() {
dis[st]=0;
que[++tail].now=st;
while(head<tail) {
oo sta=que[++head];
for(int i=r[sta.now]; ~i; i=c[i].next) {
if(dis[c[i].to]>dis[sta.now]+c[i].vv) {
oo ans;
dis[c[i].to]=dis[sta.now]+c[i].vv;
ans.now=c[i].to;
que[++tail]=ans;
}
}
}
}
bool pd=true;
int Main() {
freopen("culture.in","r",stdin);
freopen("culture.out","w",stdout);
n=read(),k=read(),m=read(),st=read(),ed=read();
memset(r,0xff,sizeof(r));
memset(dis,0x5f,sizeof(dis));
memset(res,0x5f,sizeof(res));
for(int i=1; i<=n; cul[i]=read(),++i) ;
for(int i=1; i<=k; ++i) {
for(int j=1; j<=k; ++j) {
dislik[i][j]=read();
if(dislik[i][j]) {
pd=false;
}
}
dislik[i][i]=true;
}
for(int x,y,z,i=1; i<=m; ++i) {
x=read(),y=read(),z=read();
res[y][x]=res[x][y]=min(res[x][y],z);
}
for(int i=1; i<=n; ++i) {
for(int j=1; j<=n; ++j) {
if(res[i][j]!=1600085855) {
add(i,j,res[i][j]);
}
}
}
if(!pd) {
bfs();
} else {
bfs2();
}
printf("%d",(dis[ed]==1600085855)?(-1):dis[ed]);
return 0;
}
int heh=Main();
int main() {
}