zoukankan      html  css  js  c++  java
  • A1139 | 玩成模拟题的DFS

    考试的时候有思路了,但是没写完。这题起码要40min写,思路太诡异了。

    刚刚写了一段,只过了一个case,得了18分,还行。明日再战。

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 50000
    #define MAX 0x06FFFFFF
    
    using namespace std;
    
    vector<int> v[1000];
    int cnt=1;
    map<int,int> ID2index;
    void buildConnect(int a,int b);
    bool judge(int mul,int pos);
    int mode=0;
    
    typedef struct CP{
        int a,b;
        CP(int A,int B){a=A;b=B;}
    }CP;
    
    bool cmp(CP a,CP b);
    
    int main() {
        freopen("d:/input/A1139.txt","r",stdin);
        int n,m,k;
        scanf("%d%d",&n,&m);
        while(m-->0){
            int a,b;
            scanf("%d %d",&a,&b);
            buildConnect(a,b);
            buildConnect(b,a);
        }
        scanf("%d",&k);
        while(k-->0){
            int a,b,i,j,k;
            scanf("%d %d",&a,&b);
            mode= a*b>0 ? 1 : 0 ;
            vector<CP> ot;
            int i1=ID2index[a],i2,i3;
            int O1,O2;
            FF(i,v[i1].size()) if(judge(v[i1][i]*a,0)){//find tongXing
                O1=v[i1][i];
                i2=ID2index[O1];//is tongXing
                FF(j,v[i2].size()) if(judge(v[i2][j]*a,1)){//find yiXing
                    O2=v[i2][j];
                    i3=ID2index[O2];//is yiXing
                    FF(k,v[i3].size()) if(v[i3][k]==b){//find object
                        CP tmp(abs(O1),abs(O2));
                        ot.push_back(tmp);
                        break;
                    }
                }
            }
            int s=ot.size();
            sort(ot.begin(),ot.end(),cmp);
            O("%d
    ",s);
            FF(i,s) O("%d %d
    ",ot[i].a,ot[i].b);
        }
        return 0;
    }
    
    void buildConnect(int a,int b){
        int index=ID2index[a];
        if(index>0){//find
            v[index].push_back(b);
        }else{
            ID2index[a]=cnt;//cnt is a new index
            v[cnt++].push_back(b);
        }
    }
    
    bool cmp(CP a,CP b){
        if(a.a<b.a) return true;
        else if(a.a==b.a && a.b<b.b) return true;
        return false;
    }
    
    bool judge(int mul,int pos){
        if(mode==0){
            if(pos==0 && mul>0)return true;
            if(pos==1 && mul<0)return true;
        }
        if(mode==1){
            if(pos==0 && mul>0)return true;
            if(pos==1 && mul>0)return true;
        }
        return false;
    }
    View Code

     2017年3月14日,24分:

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 10000
    #define MAX 0x06FFFFFF
    #define V vector<int>
    
    using namespace std;
    
    typedef struct Node{
        int a,b;
        Node(int a=0,int b=0):a(a),b(b){
        }
        bool operator < (const Node& obj) const
        {
            if(a<obj.a || (a==obj.a && b<obj.b))
                return 1;
            return 0;
        }
    };
    
    vector<int> adj[LEN];
    int isg[LEN];
    int vis[LEN];
    vector<int> path;
    set<Node> ans;
    
    int N,M,K;
    
    //dfs(s,e,0,mode);
    void dfs(int s,int e,int cnt,int mode){
        if(cnt>3) return;
        if(s==e && cnt==3){
            ans.insert(Node(path[0],path[1]));
            return;
        }
        int i;
        FF(i,adj[s].size()){
            int o=adj[s][i];
            if(vis[o]==0){
                bool isOK=0;
                if(mode<0){
                    if(cnt%2==0 && isg[s]*isg[o]>0) isOK=1;
                    if(cnt%2==1 && isg[s]*isg[o]<0) isOK=1;
                }else{
                    if(isg[s]*isg[o]>0) isOK=1;
                }
                if(isOK){
                    vis[o]=1;
                    path.push_back(o);
                    dfs(o,e,cnt+1,mode);
                    path.pop_back();
                    vis[o]=0;
                }
            }
        }
    }
    
    int proc(int a){
        if(a<0){
            a=-a;
            isg[a]=-1;
        }else{
            isg[a]=1;
        }
        return a;
    }
    
    int main(){
    //    freopen("1139.txt","r",stdin);
        int s,e,i,j,a,b;
        I("%d%d",&N,&M);
        while(M--){
            I("%d%d",&a,&b);
            a=proc(a);
            b=proc(b);
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
        I("%d",&K);
        while(K--){
            I("%d%d",&s,&e);
            int mode=s*e;
            s=abs(s);
            e=abs(e);
            ans.clear();
            path.clear();
            vis[s]=1;
            dfs(s,e,0,mode);
            vis[s]=0;
            set<Node>::iterator it=ans.begin();
            O("%d
    ",ans.size());
            while(it!=ans.end()){
                O("%04d %04d
    ",it->a,it->b);
                it++;
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    继承项目第13周项目1基类中成员的访问限定符和派生类的继承方式
    架构业务wait和sleep区别狭义jiavaBean规范,三层架构模式
    文件文本编辑器ASP.net使用CKEditor(html文本编辑器)
    彩信对象android(5)_发彩信操作
    方法接口UML统一建模语言,java中七种设计原则,
    jquery实现jQuery实现图片轮播效果,jQuery实现焦点新闻
    设备文件BSP及嵌入式驱动开发笔记
    Invalidate
    C#集合类使用范例
    判断一段程序是由C 编译程序还是由C++编译程序编译的
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8060171.html
Copyright © 2011-2022 走看看