SHOI2012 回家的路

2022-05-10 03:07:45 字數 1696 閱讀 7907

shoi2012 d2t1

2046 年 oi 城的城市軌道交通建設終於全部竣工,由於前期規劃周密,建成後的軌道交通網路由2n2n條地鐵線路構成,組成了乙個nn縱nn橫的交通網。如下圖所示,這2n2n條線路每條線路都包含nn個車站,而每個車站都在一組縱橫線路的交匯處。

出於建設成本的考慮,並非每個車站都能夠進行站內換乘,能夠進行站內換乘的地鐵站共有mm個,在下圖中,標上方塊標記的車站為換乘車站。已知地鐵執行 1 站需要 2 分鐘,而站內換乘需要步行 1 分鐘。serenade 想要知道,在不中途出站的前提下,他從學校回家最快需要多少時間(等車時間忽略不計)。

輸入格式:

第一行有兩個整數n,mn,m。

接下去mm行每行兩個整數x,yx,y,表示第xx條橫向線路與第yy條縱向線路的交

匯站是站內換乘站。

接下去一行是四個整數x_1,y_1,x_2,y_2x1,y1,x2,y2。表示 serenade 從學校回家時,在第 x_1x1條橫向線路與第y_1y1條縱向線路的交匯站上車,在第x_2x2條橫向線路與第y_2y2條縱向線路的交匯站下車。

輸出格式:

輸出檔案只有一行,即 serenade 在合理選擇線路的情況下,回家所需要的時間。如果 serenade 無法在不出站換乘的情況下回家,請輸出-1。

對於 30%的資料,n\le 50,m\le 1000n≤50,m≤1000;

對於 60%的資料,n\le 500,m\le 2000n≤500,m≤2000;

對於 100%的資料,n\le 20000,m\le 100000n≤20000,m≤100000;

對於每行每列暴力連邊顯然是要炸的

考慮只把相鄰的點間連邊,對於同行同列是沒有影響的

然鵝轉向就跪了

經過一番深思熟慮,我們可以把每個點拆開啊

對於每個點,橫向建乙個點,縱向建乙個點,把這兩個點間連邊\(edge=1\)

然後最短路就行了

#include#include#include#include#include#define m 1000000

#define ll long long

#define max(a,b) ((a)>(b)? (a):(b))

#define min(a,b) ((a)

#define abs(a) ((a)>0? (a) :-(a))

using namespace std;

queueq;

int i,m,n,j,k,ver[m],edge[m],head[m],nex[m],cnt,pre[m],sx,sy,ex,ey,b[m],d[m];

struct vv

a[m];

void add(int x,int y,int z)

bool cmpx(vv a,vv b)

bool cmpy(vv a,vv b)

void spfa()

} }}int main()

sort(a+1,a+1+m,cmpy);

for(i=2;i<=m;i++)

for(i=1;i<=m;i++) add(i,i+m,1), add(i+m,i,1);

spfa();

printf("%d",d[m+m+1]);

}

SHOI2012 回家的路

分層圖,每個轉彎定義為乙個操作,所以建立乙個上層全是x軸,下層全是y軸,兩層之間連一條權值為1的邊代表轉彎的代價。挺簡單的其實 include include include include include includeusing namespace std typedef long long l...

P3831 SHOI2012 回家的路 題解

題目傳送門 解法 1 每兩個點都連邊,跑裸的最短路。顯然,n 和 m 非常大,暴力連邊會 tle 和 mle。解法 2 正解 首先,對答案產生貢獻的只有換乘站,所以我們只用連兩種邊 乙個換乘站看作 2 個節點,連邊,邊權為 1 站內換乘 將 x 相等的換乘站相連,y 相等的換乘站相連。其中,起點和終...

題解 P3831 SHOI2012 回家的路

什麼叫分層圖最短路,我不會 kk 感覺自己做法和其他題解不大一樣所以過來發篇題解了。未刻意卡常拿下最優解 就是說給你乙個 n times n 的網格圖和 m 個可換乘點,然後你只能在同一行或同一列 如果在行上移動,就不能在列上移動 反之同理 上移動,除非這個點是可以換乘的。每次走一格花費 2 費,換...