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;
    }
  • 相关阅读:
    关于Combobox的多选和单选情况
    Struts2的method{1}用法
    ${sessionScope.user}的使用方法
    jQuery 遍历
    jQuery的Event对象(实例)。
    度熊全是由1构成的字符串
    Prime Ring Problem
    八皇后问题
    Hanoi
    全排列
  • 原文地址:https://www.cnblogs.com/five20/p/9375433.html
Copyright © 2011-2022 走看看