zoukankan      html  css  js  c++  java
  • P2243 电路维修

    题目背景

    Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上。在她无依无靠的时候,善良的运输队员Mark 和James 收留了她。Elf 很感谢Mark和James,可是一直也没能给他们帮上什么忙。

    题目描述

    有一天 Mark 和James 的飞行车没有办法启动了,经过检查发现原来是电路板的故障。飞行车的电路板设计很奇葩,如下图所示:

    输入输出格式

    输入格式:

     

    输入文件包含多组测试数据。第一行包含一个整数T 表示测试数据的数目。

    对于每组测试数据,第一行包含正整数 R 和C,表示电路板的行数和列数。

    之后 R 行,每行C 个字符,字符是"/"和""中的一个,表示标准件的方向。

    对于40% 的数据,R,C≤5。

    对于 100% 的数据,R,C≤500,T≤5。

     

    输出格式:

     

    对于每组测试数据,在单独的一行输出一个正整数,表示所需的缩小旋转次数。

    如果无论怎样都不能使得电源和发动机之间连通,输出 NO SOLUTION。

     

    输入输出样例

    输入样例#1: 
    1
    3 5
    \/\
    \///
    /\\
    
    输出样例#1: 
    1

    说明

    样例的输入对应于题目描述中的情况。

    只需要按照下面的方式旋转标准件,就可以使得电源和发动机之间连通。

    Solution:

      很久以前的一道题,卡spfa求最短路。

      直接把坐标变为点,对于需要旋转才能连通的对角线连边权为$1$的边,不用旋转的对角线连边权为$0$的边,然后只要跑最短路,由于是个稠密图,于是我们跑堆优化的djikstra就好了。

    代码:

    #include<bits/stdc++.h>
    #include<ext/pb_ds/assoc_container.hpp>
    #include<ext/pb_ds/priority_queue.hpp>
    #define ll long long
    #define il inline
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define debug printf("%d %s
    ",__LINE__,__FUNCTION__)
    using namespace std;
    using namespace __gnu_pbds;
    const int inf=520,N=1000005;
    int t,r,c,h[300005],cnt,dis[300505],to[N],val[N],net[N];
    char s[505];
    struct node{
        int u,d;
        node(int a=0,int b=0){u=a,d=b;}
        bool operator<(const node &a)const{return d>a.d;}
    };
    typedef __gnu_pbds::priority_queue<node,less<node>,pairing_heap_tag> heap;
    heap q;
    heap::point_iterator id[N];
    
    il void add(int u,int v,int w){
        to[++cnt]=v,net[cnt]=h[u],val[cnt]=w,h[u]=cnt;
        to[++cnt]=u,net[cnt]=h[v],val[cnt]=w,h[v]=cnt;
    }
    
    il void spfa()
    {
        For(i,0,r*c) dis[i]=0x7fffffff,id[i]=0;
        dis[1]=0;q.push(node(1,0));
        while(!q.empty()){
            node x=q.top();q.pop();
            for(int i=h[x.u];i;i=net[i])
                if(dis[to[i]]>dis[x.u]+val[i]){
                    dis[to[i]]=dis[x.u]+val[i];
                    if(id[to[i]]==0) id[to[i]]=q.push(node(to[i],dis[to[i]]));
                    else q.modify(id[to[i]],node(to[i],dis[to[i]]));
                }
        }
        dis[r*c]==dis[0]?puts("NO SOLUTION"):printf("%d
    ",dis[r*c]);
    }
    int main()
    {
        cin>>t;
        while(t--){
            cin>>r>>c;
            r++,c++;
            cnt=0;
            memset(h,0,sizeof(h));
            For(i,1,r-1){
                scanf("%s",s);
                For(j,1,c-1){
                    int zs=(i-1)*c+j,yx=i*c+j+1,ys=(i-1)*c+j+1,zx=i*c+j;
                    if(s[j-1]=='/'){add(zs,yx,1);add(ys,zx,0);}
                    else {add(zs,yx,0);add(ys,zx,1);}
                }
            }
            spfa();
        }
        return 0;
    }
  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/five20/p/9375433.html
Copyright © 2011-2022 走看看