zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    [Java学习] Java包装类、拆箱和装箱详解
    [Java学习] Java多态和动态绑定
    [Java学习] Java继承的概念与实现
    [Java学习] Java super关键字
    [Java代码] Java是自学好还是参加培训班好?
    [Java学习] Java字符串(String)
    [Java学习] Java方法重载
    [.NET源码] EF的增删改查
    C#面向服务WebService从入门到精通
    CoordinatorLayout-带图片伸缩工具栏
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12303022.html
Copyright © 2011-2022 走看看