• 2019icpc南昌网络赛



    B. Fire-Fighting Hero (dijstra优先队列+bfs)

    题意:刚开始看错题了,以为是k次dijkstra,但是wa了,后来队友指正后发现挺水的。求S到其它点的最短路的最大值ans1,然后求其它点到指定k个点之一的最短路的最大值ans2。比较ans1和ans2即可。

    思路:用dijstra优化队列求ans1,k次优先队列bfs求ans2即可。

    AC code:

    #include<cstdio>
    #include<algorithm>
    #include<cctype>
    #include<queue>
    using namespace std;
    
    inline int read()
    {
        int x=0,f=0; char ch=0;
        while(!isdigit(ch)) {f|=ch=='-';ch=getchar();}
        while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
        return f?-x:x;
    }
    const int maxn=1005;
    const int maxm=5e5+5;
    const int inf=0x3f3f3f3f;
    int T,n,m,s,k,c,cnt,head[maxn],isk[maxn],dist[maxn],vis[maxn];
    int ans1,ans2;
    
    struct node1{
        int v,w,nex;
    }edge[maxm];
    
    void adde(int u,int v,int w){
        edge[++cnt].v=v;
        edge[cnt].w=w;
        edge[cnt].nex=head[u];
        head[u]=cnt;
    }
    
    struct node2{
        int w,id;
        node2(){}
        node2(int w,int id):w(w),id(id){}
    };
    
    bool operator < (const node2& a,const node2& b){
        return a.w>b.w;
    }
    
    void dijkstra(int s)
    {
        priority_queue<node2> que;
        for(int i=1; i<=n; i++)
            dist[i]=inf,vis[i]=0;
        dist[s]=0;
        que.push(node2(0,s));
        while(!que.empty())
        {
            int u=que.top().id;
            que.pop();
            if(vis[u]) continue;
            vis[u]=1;
            for(int i=head[u];i;i=edge[i].nex) 
            {
                int v=edge[i].v;
                int w=edge[i].w;
                if(dist[v]>dist[u]+w)
                {
                    dist[v]=dist[u]+w;
                    node2 rec;
                    rec.id=v;
                    rec.w=dist[v];
                    que.push(rec);
                }
            }
        }
    }
    
    int bfs(int s){
        priority_queue<node2> que;
        for(int i=1; i<=n; ++i)
            vis[i]=0;
        que.push(node2(0,s));
        while(!que.empty()){
            node2 now=que.top();que.pop();
            int nid=now.id,nw=now.w;
            if(vis[nid]) continue;
            vis[nid]=1;
            if(isk[nid])
                return nw;
            for(int i=head[nid];i;i=edge[i].nex){
                int v=edge[i].v;
                int w=edge[i].w;
                que.push(node2(nw+w,v));
            }
        }
    }
    
    int main(){
        T=read();
        while(T--){
            n=read(),m=read(),s=read(),k=read(),c=read();
            cnt=0;
            ans1=ans2=0;
            for(int i=1;i<=n;++i)
                head[i]=0,isk[i]=0;
            for(int i=1;i<=k;++i)
                isk[read()]=1;
            for(int i=1;i<=m;++i){
                int u=read(),v=read(),w=read();
                adde(u,v,w);
                adde(v,u,w);
            }
            dijkstra(s);
            for(int i=1;i<=n;++i)
                ans1=max(ans1,dist[i]);
            for(int i=1;i<=n;++i){
                if(isk[i]) continue;
                ans2=max(ans2,bfs(i));
            }
            if(ans1<=c*ans2) printf("%d
    ",ans1);
            else printf("%d
    ",ans2);
        }
        return 0;
    }
    View Code

    E. Magic Master(暴力)

    题意:模拟。

    思路:按照题意倒着模拟即可,比赛时不敢暴力,看着会超空间时间,事实证明比赛时应该放开胆子取尝试。

    AC code:

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    int T,n,m,Q;
    struct node{
        int q,id,ans;
    }query[105];
    
    bool cmp1(const node& a,const node& b){
        return a.q>b.q;
    }
    
    bool cmp2(const node& a,const node& b){
        return a.id<b.id;
    }
    
    int main(){
        scanf("%d",&T);
        while(T--){
            scanf("%d%d%d",&n,&m,&Q);
            for(int i=1;i<=Q;++i){
                scanf("%d",&query[i].q);
                query[i].id=i;
            }
            sort(query+1,query+1+Q,cmp1);
            queue<int> que;
            for(int i=n;i>=1;--i){
                if(!que.empty()){
                    for(int j=1;j<=m;++j){
                        int tmp=que.front();que.pop();
                        que.push(tmp);
                    }
                }
                que.push(i);
            }
            int cnt=1;
            for(int i=n;i>=1;--i){
                int tmp=que.front();que.pop();
                if(i==query[cnt].q)
                    query[cnt++].ans=tmp;
                if(cnt>Q) break;
            }
            sort(query+1,query+1+Q,cmp2);
            for(int i=1;i<=Q;++i)
                printf("%d
    ",query[i].ans);
        }
        return 0;
    }
    View Code

    G. Pangu Separates Heaven and Earth(签到题)

    题意:水题,按要求输出即可。

    AC code:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    int T;
    int a;
    
    int main(){
        scanf("%d",&T);
        while(T--){
            scanf("%d",&a);
            if(a==1) printf("18000
    ");
            else printf("0
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    随机数
    ASP .NET下的301重定向如何做
    网站外部链接建设方案
    解析ASP.NET WebForm和Mvc开发的区别
    委托、匿名委托和lambda表达式
    图片垂直居中
    jquery函数写法
    [转]函数方法常用的动词
    CSS Hack
    富文本编辑器
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/11491063.html
Copyright © 2020-2023  润新知