時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 524288k,其他語言1048576k
64bit io format: %lld
小雨所在的城市一共有 mm 條地鐵線,分別標號為 1 號線,2 號線,……,m 號線。整個城市一共有 nn 個車站,編號為 1∼n1∼n 。其中坐 i 號線需要花費 aiai 的**,每坐一站就需要多花費 bibi 的**。i 號線有 cici 個車站,而且這 cici 個車站都已知,如果某一站有多條地鐵線經過,則可以在這一站換乘到另一條地鐵線,並且能多次換乘。現在小雨想從第 ss 個車站坐地鐵到第 tt 個車站,地鐵等待時間忽略不計,求最少花費的**,若不能到達輸出-1。(地鐵是雙向的,所以 ss 可能大於 tt)
第一行輸入四個正整數 n,m,s,tn,m,s,t,分別表示車站個數,地鐵線數,起點站和終點站。
第二行到第 m+1m+1 行,每行前三個數為 ai,bi,ciai,bi,ci,分別表示坐 i 號線的**,i 號線每坐一站多花的**,i 號線車站個數。接下來 cici 個數,表示 i 號線的每乙個車站的編號,單調遞增。
共一行,乙個數表示最小花費,若不能到達輸出 -1 。
示例1
複製
5 2 1 4
2 2 3 1 3 5
2 1 4 2 3 4 5
複製
7
坐 1 號線:花費 2;
1→31→3:花費 2;
換乘 2 號線:花費 2;
3→43→4:花費 1;
所以最小總花費為 7 。
1≤n≤103,1≤m≤500,1≤s,t≤n1≤n≤103,1≤m≤500,1≤s,t≤n
1≤ai,bi≤100,1≤ci≤n,m∑i=1ci≤105
建m+1層圖,第m+1是虛點,到達這個點不消耗權值,這樣就實現了站點連線了,連邊後最短路即可,不知道為什麼我的最短路寫著寫著就寫成了迷宮的最短路,導致一直在wa,以後注意點,迪傑斯特拉最短路和迷宮的不是同一類。。。。
官方題解:
/*簡化版*/
#include#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
const int n=1e3+10,m=520;
const int maxn=5e5+100;
int n,m,s,t,a[n],b[n];
vectorg[n*m];
int sub[n*m];
bool vis[n*m];
int dis[n*m];
struct node);
dis[s]=0;
while(que.size()));}}
}if(dis[t]==0x3f3f3f3f)
printf("-1\n");
else printf("%d\n",dis[t]);
}int main()
} mem(dis,0x3f3f3f3f);
if(s==t)
a[0]=b[0]=0;
s=500*n+s;
t=500*n+t;
bfs();
return 0;
}
牛客網 小白月賽16 J題 小雨坐地鐵
題意 多條地鐵線路,從起點到終點的最短路。題解 使用分層圖最短路。很容易想到建 m 層圖,如果多條地鐵線都經過同乙個點,則在這些點之間暴力兩兩連邊,這樣連邊是 o nm2 我們可以多建一層虛點,所有點到它對應的虛點不需要代價,從虛點到它對應的點需要對應的代價,這樣就可以優化到 o nm 建圖。最後跑...
牛客小白月賽16 小雨的矩陣 (暴力搜尋)
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 小雨有乙個 n nn times nn n 的矩陣,起點在 1,1 終點在 n,n 只能向下或向右走,且每次只能走 1 步。矩陣上每個點都有乙個點權 ai,ja a...
牛客小白月賽16
很容易得到n 1時,因為小石先手,所以小石一定輸 而n!1時,假設n 5 小石先取1 小陽取2 4 小石去3 小陽輸,無論怎樣小石都有贏的機會 includeusing namespace std int main 打表求出1 1e3之間的所有三角形每層之和 include define ll lo...