• PAT T1021 Safe Fruit


    暴力搜索加剪枝~

    看的人好多...更新一下:

    这道题的正解应该是求最大团之类的...暴力搜索是拿不到分的,我用了好几种奇怪的技巧用爆搜卡掉了。。。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1014;
    const int inf=1e9;
    int g[maxn][maxn];
    int c[maxn];
    int N,M;
    int mincost=1e9;
    int cost=0;
    int flag;
    int tle=0;
    int ans=0;
    bool visit[maxn];
    vector<int> path,tmp;
    void dfs (int v,int direction) {
        tle++;
        if (tle>1e5) return;
        if (tmp.size()>path.size()) {
            path=tmp;
            mincost=cost;
        }
        else if (tmp.size()==path.size()&&cost<mincost) {
            path=tmp;
            mincost=cost;
        }
        if (direction==1) {
            v++;
            while (v<=1000) {
                flag=0;
                if (c[v]==0) {
                    v++;
                    continue;
                }
                    for (int j=0;j<tmp.size();j++) 
                    if (g[v][tmp[j]]==1) {
                        flag++;
                        break;
                    }
                if (flag==0) {
                    tmp.push_back(v);
                    visit[v]=true;
                    cost+=c[v];
                    dfs (v,1);
                    tmp.pop_back();
                    visit[v]=false;
                    cost-=c[v];
                }
                v++;
            }
        }
        else {
            v--;
            while (v>=0) {
                flag=0;
                if (c[v]==0) {
                    v--;
                    continue;
                }
                for (int j=0;j<tmp.size();j++) 
                if (g[v][tmp[j]]==1) {
                    flag++;
                    break;
                }
                if (flag==0) {
                    tmp.push_back(v);
                    visit[v]=true;
                    cost+=c[v];
                    dfs (v,0);
                    tmp.pop_back();
                    visit[v]=false;
                    cost-=c[v];
                }
                v--;
            }
        }
    }
    int main () {
        scanf ("%d %d",&M,&N);
        int u,v;
        for (int i=0;i<M;i++) 
        scanf ("%d %d",&u,&v),g[u][v]=g[v][u]=1;
        for (int i=1;i<=N;i++) {
            scanf ("%d %d",&u,&v);
            c[u]=v;
            if (v>999) ans++;
        }
        if (ans!=0) dfs (0,1);
        else dfs (1000,0);
        printf ("%d
    ",path.size());
        sort (path.begin(),path.end());
        for (int i=0;i<path.size();i++) {
            if (i!=0) printf (" ");
            printf ("%03d",path[i]);
        }
        printf ("
    %d",mincost);
        return 0;
    }
  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12303022.html
Copyright © 2020-2023  润新知