2017.5.8 文化之旅 思考记录

来源:互联网 发布:黑白网络 编辑:程序博客网 时间:2024/06/16 13:55

        这个题就是搜索+剪枝,,但有一些剪枝的方法是值得借鉴的:


1、最优性剪枝:

 ①当前答案 与 当前距离的比较

②当前距离+最短路 与 当前答案的比较

2、可行性剪枝:

  ①终点肯定要走,与终点相斥或相同的都直接剪掉


3、玄学卡过:

一般出题人卡正搜但不卡倒搜,所以一般搜索题倒搜或双向搜。。



码:

#include<iostream>#include<cstdio> using namespace std;#include<cstring>int n,k,m,s,t,tu[150][150],ans=1e9,wh[150],xue[150],i,j,x,y,z,xia[150][150];bool zou[150],dui[150][150];void dfs(int now,int juli){      if(juli>=ans)return;    if(now==s)    {           ans=min(ans,juli);            return ;        }        int i,j;bool keyi;    for(i=1;i<=n;i++)    {          if(tu[now][i]>1e7||zou[i]||xue[wh[i]])continue; keyi=1;        for(j=1;j<=k;j++)if(dui[i][j]&&xue[j]){keyi=0;break;}        if(!keyi)continue;        xue[wh[i]]++;        zou[i]=1;        dfs(i,juli+tu[now][i]);        xue[wh[i]]--;        zou[i]=0;        }    }int main(){    scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);    for(i=1;i<=n;i++)scanf("%d",&wh[i]);    memset(tu,0x7f,sizeof(tu));    for(i=1;i<=k;i++)    for(j=1;j<=k;j++)    cin>>dui[i][j];    for(i=1;i<=m;i++)    {    scanf("%d%d%d",&x,&y,&z);    tu[x][y]=tu[y][x]=min(tu[x][y],z);    }    for(i=1;i<=k;i++)for(j=1;j<=k;j++){if(dui[i][j])dui[j][i]=1;}    zou[t]=1;    xue[wh[t]]=1;    dfs(t,0);    if(ans==1e9)printf("-1");    else printf("%d",ans);}


0 0
原创粉丝点击