首页 > 代码库 > AC日记——文化之旅 洛谷 P1078

AC日记——文化之旅 洛谷 P1078

文化之旅

 

思路:

  暴搜,倒搜;

 

代码:

#include <bits/stdc++.h>using namespace std;#define maxn 105#define maxm 200005#define INF 0x7fffffffint n,k,m,s,t,E[maxm],V[maxm],head[maxn];int cnt,W[maxm],num[maxn],ci[maxn],ans=INF;bool map_[maxn][maxn],if_[maxn];inline void in(int &now){    char Cget=getchar();now=0;        while(Cget>9||Cget<0)Cget=getchar();    while(Cget>=0&&Cget<=9)    {        now=now*10+Cget-0;        Cget=getchar();    }}inline void edge_add(int u,int v,int w){    E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt;    E[++cnt]=head[v],V[cnt]=u,W[cnt]=w,head[v]=cnt;}inline bool check(int now){    for(int i=1;i<=k;i++) if(map_[now][i]&&num[ci[i]]) return true;    return false;}void dfs(int now,int dis){    if(dis>=ans) return;    if(now==s)    {        ans=dis;return;    }    if_[now]=true,num[ci[now]]++;    for(int i=head[now];i;i=E[i])    {        if(if_[V[i]]||check(ci[V[i]])) continue;        dfs(V[i],dis+W[i]);    }    if_[now]=false,num[ci[now]]--;}int main(){    in(n),in(k),in(m),in(s),in(t);    for(int i=1;i<=n;i++) in(ci[i]);    int pos;    for(int i=1;i<=k;i++)    {        for(int j=1;j<=k;j++)in(pos),map_[i][j]=pos;    }    int u,v,w;    for(int i=1;i<=m;i++)    {        in(u),in(v),in(w);        edge_add(u,v,w);    }    dfs(t,0);    printf("%d\n",ans==INF?-1:ans);    return 0;}

 

AC日记——文化之旅 洛谷 P1078