P3831 SHOI2012 回家的路 題解

2022-09-19 15:15:13 字數 1121 閱讀 6856

題目傳送門

解法 1:

每兩個點都連邊,跑裸的最短路。

顯然,\(n\) 和 \(m\) 非常大,暴力連邊會 tle 和 mle。

解法 2(正解):

首先,對答案產生貢獻的只有換乘站,所以我們只用連兩種邊:

乙個換乘站看作 \(2\) 個節點,連邊,邊權為 \(1\)(站內換乘)。

將 \(x\) 相等的換乘站相連,\(y\) 相等的換乘站相連。

其中,起點和終點也要加入圖中。

建完圖後,因為起點有兩個,乙個是 \(0\),乙個是 \(m+1\),以這兩個為源點跑最短路,再取個最小值即可。

#include using namespace std;

inline int read();

inline void write(int);

int n,m;

struct poia[200005];

struct edgee[1000005<<1];

int head[200005],idx;

void link(int x,int y,int w);

head[x]=idx;

}bool cmp1(poi a,poi b)}}

}int main()

int x1=read(),y1=read(),x2=read(),y2=read();

a[0]=poi;a[m+1]=poi;

sort(a,a+m+2,cmp1);

for(int i=1;i<=m+1;i++)

}sort(a,a+m+2,cmp2);

for(int i=1;i<=m+1;i++)

}dijkstra(0);

ans=min(dis[m+1],dis[2*m+3]);

dijkstra(m+2);

ans=min(ans,min(dis[m+1],dis[2*m+3]));

write(ans!=0x3f3f3f3f?ans:-1);

return 0;

}inline int read()

inline void write(int x)

題解 P3831 SHOI2012 回家的路

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

SHOI2012 回家的路

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

SHOI2012 回家的路

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