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; }
本人蒟蒻,欢迎各dalao指教

浙公网安备 33010602011771号