比赛 |
20190521热身赛 |
评测结果 |
AAAAAAAAAT |
题目名称 |
文化之旅 |
最终得分 |
90 |
用户昵称 |
ziiidan |
运行时间 |
1.011 s |
代码语言 |
C++ |
内存使用 |
13.84 MiB |
提交时间 |
2019-05-21 19:21:23 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x7fffffff
using namespace std;
const int maxn=105;
struct Edge{
int x,y,w,nxt;
}e[maxn*maxn];
int n,k,m,S,T;
int cnt,ans=INF;
int head[maxn];
int c[maxn];
bool un[maxn][maxn],vis[maxn];
void init()
{
memset(head,-1,sizeof(head));
}
inline void add(int x,int y,int w)
{
e[++cnt].x=x;
e[cnt].y=y;
e[cnt].w=w;
e[cnt].nxt=head[x];
head[x]=cnt;
}
void dfs(int x,int cost)
{
bool flag=false;
//vis[x]=true;
if(x==T)
{
ans=min(ans,cost);
return ;
}
if(cost>ans) return ;
for(register int i=head[x];i!=-1;i=e[i].nxt)
{
if(vis[e[i].y]) continue;
//cout<<e[i].y<<endl;
for(register int j=1;j<=n;j++)
{
if(vis[j]&&un[c[e[i].y]][c[j]])
{
flag=true;
//cout<<"bif"<<endl;
break;
}
}
if(flag)
{
flag=false;
continue;
}
vis[e[i].y]=true;
dfs(e[i].y,cost+e[i].w);
vis[e[i].y]=false;
}
//cout<<"Asdasdad"<<endl;
//vis[x]=false;
}
int main()
{
freopen("culture.in","r",stdin);
freopen("culture.out","w",stdout);
int fr,to,val;
scanf("%d%d%d%d%d",&n,&k,&m,&S,&T);
init();
for(register int i=1;i<=n;i++) scanf("%d",c+i);
for(register int i=1;i<=k;i++)
for(register int j=1;j<=k;j++)
{
scanf("%d",&val);
if(val==1) un[i][j]=true;
}
for(register int i=1;i<=m;i++)
{
scanf("%d%d%d",&fr,&to,&val);
add(fr,to,val);
add(to,fr,val);
}
vis[S]=true;
dfs(S,0);
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
return 0;
}