[Swust OJ 582]--放学了,抢机子了(SPFA)
题目链接:http://acm.swust.edu.cn/problem/0582/
Time limit(ms): 5000 Memory limit(kb): 65535
Description
西南科技大学人数众多,学生多了附近的网吧也多。
很多同学都热衷于上网,虽然学校提供了开放机房,但由于各种原因导致大家去网吧的兴趣还高些。平时网吧的情况还好些,然而周末放假是绝好的时间,但是学校人多啊,一放学去网吧的人就开始狂奔,竞争之激烈,抢到机子的难度非常之大。往往在我们到达网吧之前都坐满了。
学校到网吧的路是错综复杂的,以致于到一个自己想去的网吧都有非常多的路线可以选择,而路线的长度又不相同,这样就决定了要花费的时间,因此想要尽快到达,选择一条最佳的线路是很有必要的。
为了简化问题,我们把学校与周边的网吧看做图中的顶点,学校与网吧,网吧与网吧之间的路线看做边,每个边都有一个权,表示我们走完这条路的时间,由于放学人流量大,如果反向走会有危险,因此这是一个有向图。
我的的学校在S点,想要去的网吧在T点。你的任务就是选择一条最佳路线,使得从学校到目的地网吧的时间最短,你只需要输出最短到达时间即可。
很多同学都热衷于上网,虽然学校提供了开放机房,但由于各种原因导致大家去网吧的兴趣还高些。平时网吧的情况还好些,然而周末放假是绝好的时间,但是学校人多啊,一放学去网吧的人就开始狂奔,竞争之激烈,抢到机子的难度非常之大。往往在我们到达网吧之前都坐满了。
学校到网吧的路是错综复杂的,以致于到一个自己想去的网吧都有非常多的路线可以选择,而路线的长度又不相同,这样就决定了要花费的时间,因此想要尽快到达,选择一条最佳的线路是很有必要的。
为了简化问题,我们把学校与周边的网吧看做图中的顶点,学校与网吧,网吧与网吧之间的路线看做边,每个边都有一个权,表示我们走完这条路的时间,由于放学人流量大,如果反向走会有危险,因此这是一个有向图。
我的的学校在S点,想要去的网吧在T点。你的任务就是选择一条最佳路线,使得从学校到目的地网吧的时间最短,你只需要输出最短到达时间即可。
Input
共有M+2 行数据
第一行两个整数N,M,表示点数和边数。
然后M行每行3 个正整数(u,v,t),表示有一条可由u 到v耗时为t的边。
最后一行两个正整数S、T。
1< N <=10000,1<= M <=100000
第一行两个整数N,M,表示点数和边数。
然后M行每行3 个正整数(u,v,t),表示有一条可由u 到v耗时为t的边。
最后一行两个正整数S、T。
1< N <=10000,1<= M <=100000
Output
只有一行,一个整数表示最短时间。如果S、T之间不存在通路则输
出“No Solution!”(双引号不输出)。
出“No Solution!”(双引号不输出)。
Sample Input
4 4
1 2 3
2 4 10
1 3 5
3 4 5
1 4
|
Sample Output
10 |
解题思路:明显是求单源最短路径,时间不可能为负值吧,不存在负环,所以这里用SPFA(链接)可以轻松搞定Orz~~~
代码如下:
1 #include <iostream> 2 #include <queue> 3 #include <vector> 4 #include <cstring> 5 using namespace std; 6 7 #define maxn 10005 8 #define inf 0x3f3f3f3f 9 10 struct node{ 11 int v, w; 12 node(int x, int y) :v(x), w(y){}; 13 node(){}; 14 }; 15 16 vector<node>mpt[maxn]; 17 //ptr判断一个点的入队操作次数,判断负环 18 int vis[maxn], ptr[maxn], dis[maxn], t, n, m, u, v, w, s; 19 20 int Spfa(int s){ 21 queue<int>Q; 22 Q.push(s); 23 vis[s] = 1, dis[s] = 0, ptr[s] = 1; 24 while (!Q.empty()){ 25 int u = Q.front(); 26 Q.pop(); 27 vis[u] = 0; 28 for (int i = 0; i<mpt[u].size(); i++){ 29 v = mpt[u][i].v; 30 if (dis[v]>dis[u] + mpt[u][i].w){ 31 dis[v] = dis[u] + mpt[u][i].w; 32 if (!vis[v]){ 33 vis[v] = 1; 34 Q.push(v); 35 if (++ptr[v] > n) return 0; 36 } 37 } 38 } 39 } 40 return 1; 41 } 42 43 int main(){ 44 while (cin >> n >> m){ 45 memset(vis, 0, sizeof(vis)); 46 memset(dis, inf, sizeof(dis)); 47 memset(ptr, 0, sizeof(ptr)); 48 for (int i = 0; i < m; i++){ 49 cin >> u >> v >> w; 50 mpt[u].push_back(node(v, w)); 51 } 52 cin >> s >> t; 53 if (Spfa(s)) 54 cout << dis[t] << endl; 55 else 56 cout << "No Solution!\n"; 57 } 58 return 0; 59 }
如果这是你所爱的,就不要让自己后悔~~~