UVa 10986 - Sending email (Dijkstra优化, SPFA)
来源:互联网 发布:社交软件的英文 编辑:程序博客网 时间:2024/06/05 03:45
链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1927
题目:
Sending email
Time Limit: 3 seconds
Springfield. Mr. X, if that is his real name, has
come up with a sensational scoop."Kent Brockman
There are n SMTP servers connected by network cables. Each of the m cables connects two computers and has a certain latency measured in milliseconds required to send an email message. What is the shortest time required to send a message from server S to server T along a sequence of cables? Assume that there is no delay incurred at any of the servers.
Input
The first line of input gives the number of cases, N. N test cases follow. Each one starts with a line containing n(2<=n<20000), m (0<=m<50000), S (0<=S<n) and T (0<=T<n). S!=T. The next m lines will each contain 3 integers: 2 different servers (in the range [0, n-1]) that are connected by a bidirectional cable and the latency, w, along this cable (0<=w<=10000).
Output
For each test case, output the line "Case #x:" followed by the number of milliseconds required to send a message from S toT. Print "unreachable" if there is no route from S to T.
32 1 0 10 1 1003 3 2 00 1 1000 2 2001 2 502 0 0 1
Case #1: 100Case #2: 150Case #3: unreachable
Problemsetter: Igor Naverniouk
题目大意:
给一个图, 求从s点到t点的最小距离。
分析与总结:
赤裸裸的最短路,但n太大显然是不能用邻接矩阵的,需要用邻接表+优先队列优化。
代码:
1. Dijkstra, 0.148s
#include<cstdio>#include<cstring>#include<utility>#include<queue>using namespace std;typedef pair<int,int>pii;priority_queue<pii,vector<pii>,greater<pii> >q;const int N = 100005;const int INF = 1000000000;int n, m, beg, end, k;int head[N], next[N], u[N], v[N], w[N], d[N];bool vis[N]; inline void read_graph(){ scanf("%d%d%d%d",&n,&m,&beg,&end); memset(head, -1, sizeof(head)); for(int e=1; e<=m; ++e){ scanf("%d%d%d",&u[e],&v[e],&w[e]); u[e+m]=v[e], v[e+m]=u[e], w[e+m]=w[e]; next[e] = head[u[e]]; head[u[e]] = e; next[e+m] = head[u[e+m]]; head[u[e+m]] = e+m; }}inline void Dijkstra(int src){ memset(vis, 0, sizeof(vis)); for(int i=0; i<n; ++i) d[i] = INF; d[src] = 0; q.push(make_pair(d[src], src)); while(!q.empty()){ pii u = q.top(); q.pop(); int x = u.second; if(vis[x]) continue; vis[x] = true; for(int e=head[x]; e!=-1; e=next[e])if(d[v[e]] > d[x]+w[e]){ d[v[e]] = d[x]+w[e]; q.push(make_pair(d[v[e]], v[e])); } }}int main(){ int T,cas=1; scanf("%d",&T); while(T--){ read_graph(); Dijkstra(beg); printf("Case #%d: ",cas++); if(d[end]!=INF) printf("%d\n", d[end]); else puts("unreachable"); } return 0;}
2.SPFA, 0.160s
#include<cstdio>#include<cstring>#include<utility>#include<queue>using namespace std;queue<int>q;const int N = 100005;const int INF = 1000000000;int n, m, beg, end, k;int head[N], next[N], u[N], v[N], w[N], d[N];bool vis[N]; inline void read_graph(){ scanf("%d%d%d%d",&n,&m,&beg,&end); memset(head, -1, sizeof(head)); for(int e=1; e<=m; ++e){ scanf("%d%d%d",&u[e],&v[e],&w[e]); u[e+m]=v[e], v[e+m]=u[e], w[e+m]=w[e]; next[e] = head[u[e]]; head[u[e]] = e; next[e+m] = head[u[e+m]]; head[u[e+m]] = e+m; }}inline void SPFA(int src){ memset(vis, 0, sizeof(vis)); for(int i=0; i<n; ++i) d[i] = INF; d[src] = 0; q.push(src); while(!q.empty()){ int u = q.front(); q.pop(); vis[u] = false; for(int e=head[u]; e!=-1; e=next[e])if(d[v[e]] > d[u]+w[e]){ d[v[e]] = d[u] + w[e]; if(!vis[v[e]]){ vis[v[e]] = true; q.push(v[e]); } } }}int main(){ int T,cas=1; scanf("%d",&T); while(T--){ read_graph(); SPFA(beg); printf("Case #%d: ",cas++); if(d[end]!=INF) printf("%d\n", d[end]); else puts("unreachable"); } return 0;}
—— 生命的意义,在于赋予它意义。
原创 http://blog.csdn.net/shuangde800 , By D_Double (转载请标明)
- UVa 10986 - Sending email (Dijkstra优化, SPFA)
- UVA 10986Sending email 【dijkstra + 堆优化】
- UVA 10986 Sending email(SPFA)
- UVA 10986 Sending email SPFA
- UVa 10986 Sending email / 优先队列优化dijkstra
- Sending email - UVa 10986 Dijkstra+优先队列优化
- UVa 10986 Sending email (最短路+Dijkstra队列优化)
- uva 10986 - Sending email(最短路Dijkstra)
- uva 10986 Sending email (dijkstra)
- UVa 10986 Sending email 优先队列优化的dijkstra 和 朴素dijkstra 效率对比
- UVA - 10986 Sending email (Dijkstra邻接表+优先队列优化)
- UVA - 10986 Sending email 最短路的spfa算法
- uva 10986 - Sending email
- UVA 10986 - Sending email
- UVa:10986 Sending email
- UVA - 10986 Sending email
- UVa 10986 - Sending email
- UVa 10986 - Sending email
- PHP FastCGI 的远程利用
- Stack实现
- 关于sensor在android系统原生应用中的使用(从应用层面验证sensor移植)
- VB导出EXCEL
- linux ipcs 命令详解
- UVa 10986 - Sending email (Dijkstra优化, SPFA)
- C# 生成Excel插入图表
- 插入耳机时播放音乐,铃声和闹钟,音乐没有声音的问题解决
- 条款43:学习处理模板化基类的名称
- Maven多模块项目管理小结
- 关于登录sql server 2005 出现“已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程”的问题
- SqlServer2005 建立索引
- 在汇编中引用C语言中的结构体
- Android Training - 使用OpenGL ES(1) - 构建OpenGL ES环境