1. 程式人生 > >洛谷 P2243 電路維修

洛谷 P2243 電路維修

電路板 技術 elf opera front 奇葩 content truct 單獨

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

說明

樣例的輸入對應於題目描述中的情況。

只需要按照下面的方式旋轉標準件,就可以使得電源和發動機之間連通。

技術分享

思路:跑最短路。

錯因:數組開小了,邊數太多spfa會TLE應該用dijstra

60分代碼:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 350010
using namespace std;
char s[1010];
int t,r,c,tot;
int vis[MAXN],dis[MAXN];
int to[MAXN*2],net[MAXN*2],cap[MAXN*2],head[MAXN*2];
void add(int u,int
v,int w){ to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot; to[++tot]=u;net[tot]=head[v];cap[tot]=w;head[v]=tot; } void spfa(int s){ queue<int>que; memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); que.push(s); dis[s]=0;vis[s]=1; while(!que.empty()){ int now=que.front(); que.pop(); vis[now]=0; for(int i=head[now];i;i=net[i]) if(dis[to[i]]>dis[now]+cap[i]){ dis[to[i]]=dis[now]+cap[i]; if(!vis[to[i]]){ vis[to[i]]=1; que.push(to[i]); } } } } int main(){ scanf("%d",&t); while(t--){ tot=0; memset(head,0,sizeof(head)); scanf("%d%d",&r,&c); for(int i=1;i<=r;i++){ scanf("%s",s); for(int j=0;j<c;j++) if(s[j]==/){ add((i-1)*(c+1)+j+2,i*(c+1)+j+1,0); add((i-1)*(c+1)+j+1,i*(c+1)+j+2,1); } else{ add((i-1)*(c+1)+j+1,i*(c+1)+j+2,0); add((i-1)*(c+1)+j+2,i*(c+1)+j+1,1); } } spfa(1); if(dis[(r+1)*(c+1)]==0x3f3f3f3f) cout<<"NO SOLUTION"<<endl; else cout<<dis[(r+1)*(c+1)]<<endl; } }

AC代碼:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1050010
using namespace std;
struct nond{
    int number,dis;
    bool operator < (nond b) const{
        return dis>b.dis;
    }
};
char s[1010];
int t,r,c,tot;
int dis[MAXN];
int to[MAXN*2],net[MAXN*2],cap[MAXN*2],head[MAXN*2];
void add(int u,int v,int w){
    to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot;
    to[++tot]=u;net[tot]=head[v];cap[tot]=w;head[v]=tot;
}
void dijkstra(int s){
    priority_queue<nond>que;
    memset(dis,0x3f,sizeof(dis));
    que.push((nond){s,0});
    dis[s]=0;
    while(!que.empty()){
        nond now=que.top();
        que.pop();
        if(dis[now.number]!=now.dis)    continue;
        for(int i=head[now.number];i;i=net[i])
            if(dis[to[i]]>dis[now.number]+cap[i]){
                dis[to[i]]=dis[now.number]+cap[i];
                que.push((nond){to[i],dis[to[i]]});
            }
    }
}
int main(){
    scanf("%d",&t);
    while(t--){
        tot=0;
        memset(head,0,sizeof(head));
        scanf("%d%d",&r,&c);
        for(int i=1;i<=r;i++){
            scanf("%s",s+1);
            for(int j=1;j<=c;j++)
                if(s[j]==/){
                    add((i-1)*(c+1)+j+1,i*(c+1)+j,0);
                    add((i-1)*(c+1)+j,i*(c+1)+j+1,1);
                }    
                else{
                    add((i-1)*(c+1)+j,i*(c+1)+j+1,0);
                    add((i-1)*(c+1)+j+1,i*(c+1)+j,1);
                }
        }
        dijkstra(1);
        if(dis[(r+1)*(c+1)]==0x3f3f3f3f)    cout<<"NO SOLUTION"<<endl;
        else     cout<<dis[(r+1)*(c+1)]<<endl;
    }
}

洛谷 P2243 電路維修