比赛 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;
}