zoukankan      html  css  js  c++  java
  • 1905. Travel in Time 夜

    http://acm.timus.ru/problem.aspx?space=1&num=1905

    把某个星球的某个时间 作为一个点 进行建图 由于时间可以等待 所以同一个星球的相邻时间也要加边

    最后dfs bfs 都可以了 刚开始一直TLE  原来是vector 没用好  在记录路径的时候一直在0位置插入 结果时间复杂度太高了

    改成在最后位置push_back 就可以了

    bfs代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<vector>
    #include<stack>
    #include<set>
    #include<map>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #define LL long long
    #define sint short int
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    const int N=300005;
    const LL K=10000000;
    const int INF=0x3f3f3f3f;
    //typedef pair<int,int>point;
    struct node
    {
        int j,next;
    }side[N];
    int head[N],I;
    bool visited[N];
    int f[N];
    int sf[N];
    struct node1
    {
        int k;
        LL x;
    }mem[N];
    map<LL,int>mt;
    vector<int>vt;
    void add(int i,int j)
    {
        side[I].j=j;
        side[I].next=head[i];
        head[i]=I++;
    }
    int nd,m;
    bool bfs(int s)
    {
        queue<int>qt;
        qt.push(s);
        visited[s]=true;
        f[s]=-1;
        sf[s]=-1;
        while(!qt.empty())
        {
            int x=qt.front();qt.pop();
            if(x==nd)
            return true;
            for(int t=head[x];t!=-1;t=side[t].next)
            {
                int j=side[t].j;
                if(!visited[j])
                {
                    visited[j]=true;
                    qt.push(j);
                    f[j]=x;
                    sf[j]=t;
                }
            }
        }
        return false;
    }
    void dfs(int x)
    {
        if(f[x]!=-1)
        dfs(f[x]);
        if(sf[x]<=m&&f[x]!=-1)
        vt.push_back(sf[x]);
    }
    bool cmp(node1 a,node1 b)
    {
        return a.x<b.x;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int n;
        cin>>n>>m;
        memset(head,-1,sizeof(head));
        I=1;
        int k=1;
        LL p1,p2,t1,t2;
        LL x1,x2;
        for(int i=1;i<=m;++i)
        {
            cin>>p1>>p2>>t1>>t2;
            x1=p1*K+t1;
            x2=p2*K+t2;
            if(mt.find(x1)==mt.end())
            {mem[k].x=x1;mt[x1]=k++;}
            if(mt.find(x2)==mt.end())
            {mem[k].x=x2;mt[x2]=k++;}
            add(mt[x1],mt[x2]);
        }
        cin>>p1>>p2>>t1>>t2;
        x1=p1*K+t1;
        x2=p2*K+t2;
        if(mt.find(x1)==mt.end())
        {mem[k].x=x1;mt[x1]=k++;}
        if(mt.find(x2)==mt.end())
        {mem[k].x=x2;mt[x2]=k++;}
        nd=mt[x2];
        for(int i=1;i<k;++i)
        mem[i].k=i;
        sort(mem+1,mem+k,cmp);
        for(int i=1;i<k-1;++i)
        if(mem[i].x/K==mem[i+1].x/K)
        add(mem[i].k,mem[i+1].k);
        memset(visited,false,sizeof(visited));
        if(bfs(mt[x1]))
        {
            dfs(nd);
            cout<<vt.size()<<endl;
            for(unsigned int i=0;i<vt.size();++i)
            {
                if(i>0)
                cout<<" ";
                cout<<vt[i];
            }
            cout<<endl;
        }else
        {
            cout<<"Impossible"<<endl;
        }
        return 0;
    }
    

      dfs代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<vector>
    #include<stack>
    #include<set>
    #include<map>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #define LL long long
    #define sint short int
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    const int N=300005;
    const LL K=10000000;
    const int INF=0x3f3f3f3f;
    //typedef pair<int,int>point;
    struct node
    {
        int j,next;
    }side[N];
    int head[N],I;
    bool visited[N];
    struct node1
    {
        int k;
        LL x;
    }mem[N];
    map<LL,int>mt;
    vector<int>vt;
    void add(int i,int j)
    {
        side[I].j=j;
        side[I].next=head[i];
        head[i]=I++;
    }
    int nd,m;
    bool dfs(int x)
    {
        visited[x]=true;
        if(x==nd)
        return true;
        for(int t=head[x];t!=-1;t=side[t].next)
        {
            int j=side[t].j;
            if(!visited[j])
            {
                if(dfs(j))
                {
                    if(t<=m)
                    vt.push_back(t);
                    return true;
                }
            }
        }
        return false;
    }
    bool cmp(node1 a,node1 b)
    {
        return a.x<b.x;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int n;
        cin>>n>>m;
        memset(head,-1,sizeof(head));
        I=1;
        int k=1;
        LL p1,p2,t1,t2;
        LL x1,x2;
        for(int i=1;i<=m;++i)
        {
            cin>>p1>>p2>>t1>>t2;
            x1=p1*K+t1;
            x2=p2*K+t2;
            if(mt.find(x1)==mt.end())
            {mem[k].x=x1;mt[x1]=k++;}
            if(mt.find(x2)==mt.end())
            {mem[k].x=x2;mt[x2]=k++;}
            add(mt[x1],mt[x2]);
        }
        cin>>p1>>p2>>t1>>t2;
        x1=p1*K+t1;
        x2=p2*K+t2;
        if(mt.find(x1)==mt.end())
        {mem[k].x=x1;mt[x1]=k++;}
        if(mt.find(x2)==mt.end())
        {mem[k].x=x2;mt[x2]=k++;}
        nd=mt[x2];
        for(int i=1;i<k;++i)
        mem[i].k=i;
        sort(mem+1,mem+k,cmp);
        for(int i=1;i<k-1;++i)
        if(mem[i].x/K==mem[i+1].x/K)
        add(mem[i].k,mem[i+1].k);
        memset(visited,false,sizeof(visited));
        if(dfs(mt[x1]))
        {
            cout<<vt.size()<<endl;
            for(int i=vt.size()-1;i>=0;--i)
            {
    
                cout<<vt[i]<<" ";
            }
            cout<<endl;
        }else
        {
            cout<<"Impossible"<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    执行git log/status等命令时,重新打开了个窗口,必须按q才能退出
    ./configure时候遇到的问题 Cannot find install-sh, install.sh, or shtool in ac-aux
    Linux tty驱动架构
    of_property_read_string_index(转)
    Linux 内核启动信息的打印 --- dev_driver_string函数/dev_name函数
    USB、UART、SPI等总线速率(转)
    在业务中的逻辑思维
    在无法判断是否会出错的情况下进行的操作
    jqgrid 不能选中行, 每次点击单元格都会选中最后一行(也有可能是其他行)
    H+关闭tab框
  • 原文地址:https://www.cnblogs.com/liulangye/p/2869164.html
Copyright © 2011-2022 走看看