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 費,換...