2012文化之旅---大水题

思路:爆搜dfs

不多说,直接上代码

#include<iostream>
#include<cstring>
using namespace std;
bool ec[105][105];
int mp[105][105];
int ct[105],study[105];
int dis[105];
int n,k,m,bg,ed,flag;
bool pd(int x)
{
    for(int i=1;i<=k;i++)
    {
        if((study[i]&&ec[ct[x]][i])||(study[i]&&i==ct[x]))return 0;
    }
    return 1;
}
int search(int x)
{
    flag=0;
    if(!study[ct[x]])
    {
    flag=1;
    study[ct[x]]=1;
}
    for(int i=1;i<=n;i++)
    {
        if(mp[x][i]+dis[x]<dis[i]&&pd(i)){dis[i]=mp[x][i]+dis[x];search(i);}
    }
    if(flag==1)study[ct[x]]=0;
}
int main()
{
    cin>>n>>k>>m>>bg>>ed;
    for(int i=1;i<=n;i++)
       cin>>ct[i];
    for(int i=1;i<=k;i++)
       for(int j=1;j<=k;j++)
            cin>>ec[i][j];
    memset(mp,127/3,sizeof(mp));
    for(int i=1;i<=n;i++)dis[i]=999999;
    for(int i=1;i<=m;i++)
    {
        int x,y,v;
        cin>>x>>y>>v;
        mp[x][y]=mp[y][x]=v;
    }
    dis[bg]=0;
    search(bg);
    if(dis[ed]!=999999)cout<<dis[ed];
    else cout<<-1;
    return 0;
}

 

posted @ 2017-11-03 15:15  hcute  阅读(139)  评论(0)    收藏  举报