92pts求助
查看原帖
92pts求助
450246
Eleveslaine楼主2023/7/9 10:38
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
template <typename T>
inline T read()
{
    T ans=0,f=1;char c;
    while((c=getchar())<'0'||c>'9') if(c=='-') f=-1;
    do {ans=ans*10+c-'0';} while((c=getchar())>='0'&&c<='9');
    return ans*f;
}
#define maxn 105
#define maxm 10005
#define inf 0x3f3f3f3f
int n,k,m,s,t,c[maxn],cnt,head[maxn],ans=inf;
bool learned[maxn],flag=0;
bool a[maxn][maxn];
struct Edge
{
    int to,next,w;
} edge[maxm<<1];
inline void add(int u,int v,int w)
{
    edge[++cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt;
}
inline bool ableto(int u)
{
    if(learned[c[u]])
        return 0;
    for(int i=1;i<=k;++i)
        if(a[u][i] && learned[i])
            return 0;
    return 1;
}
inline void dfs(int u,int sum)
{
    if(sum>ans)
        return;
    if(u==t)
    {
        ans=min(ans,sum);
        flag=1;
        return;
    }
    for(int i=head[u];i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(ableto(v))
        {
            learned[c[v]]=1;
            dfs(v,sum+edge[i].w);
            learned[c[v]]=0;
        }
    }
}
signed main()
{
    n=read<int>(),k=read<int>(),m=read<int>(),s=read<int>(),t=read<int>();
    for(int i=1;i<=n;++i)
        c[i]=read<int>();
    if(c[s]==c[t])
    {
        cout << -1 << endl;
        return 0;
    }
    for(int i=1;i<=k;++i)
        for(int j=1;j<=k;++j)
            a[i][j]=read<int>();
    for(int i=1;i<=m;++i)
    {
        int u=read<int>(),v=read<int>(),w=read<int>();
        add(u,v,w),add(v,u,w);
    }
    learned[c[s]]=1;
    dfs(s,0);
    if(flag)
        cout << ans << endl;
    else
        cout << -1 << endl;
    return 0;
}

WA on #10,应输出 -1,但是寄。

qwq

2023/7/9 10:38
加载中...