HDU 2680(最短路)(多个起始点)
这道题也是死命TLE。。
http://acm.hdu.edu.cn/showproblem.php?pid=2680
- /*
- 使用pair代替结构
- */
- #include <iostream>
- #include <cstdio>
- #include <queue>
- #include <vector>
- using namespace std;
- const int Ni = ;
- const int INF = 0x3f3f3f3f;
- typedef pair<int,int> pa;
- int dis[Ni],n;//dis使用1-n的部分
- vector<pair<int,int> > eg[Ni];
- void Dijkstra(int s)
- {
- int i,j;
- for(i=;i<=n;i++)//要到n
- dis[i] = INF;
- priority_queue<pa> q; //优先级队列:小顶堆
- dis[s] = ;
- q.push(make_pair(s,dis[s]));
- while(!q.empty())
- {
- pa x = q.top();
- q.pop();
- int w = x.first;
- for(j = ;j<eg[w].size();j++)//遍历x的所有邻接点
- {
- pa y = eg[w][j];//y是x的邻接点
- int u = y.first;
- if(dis[u]>x.second+y.second)
- {
- dis[u] = x.second+y.second;
- q.push(make_pair(u,dis[u]));
- }
- }
- }
- }
- int main()
- {
- int m,a,b,y,d,min;//关系个数
- while(cin>>n>>m>>y)
- {
- for(int i = ;i<=n;i++)
- eg[i].clear();//初始化
- while(m--)
- {
- cin>>a>>b>>d;
- eg[b].push_back(make_pair(a,d));
- }
- Dijkstra(y);
- int t,x;
- min = INF;
- cin>>t;
- while(t--)
- {
- cin>>x;
- if(dis[x]<min)
- min = dis[x];
- }
- if(min!=INF)
- cout<<min<<endl;
- else
- cout<<"-1\n";
- }
- return ;
- }
已ac,514MS
思路1:加辅助点
- #include <cstdio>
- using namespace std;
- const int L = ;
- const int INF = <<;
- int map[L][L];
- int vis[L];
- int dis[L];
- int n,m;
- void Dijkstra()
- {
- int i,j,k;
- int min;
- for(i = ;i<=n;i++)
- {
- dis[i] = map[][i];
- vis[i] = ;
- }
- vis[] = ;
- dis[] = ;
- for(i = ;i<=n;i++)
- {
- min = INF;
- for(j = ;j<=n;j++)
- {
- if(dis[j]<min && !vis[j])
- {
- k = j;
- min = dis[j];
- }
- }
- vis[k] = ;
- for(j = ;j<=n;j++)
- {
- if(dis[j] > min+map[k][j] && !vis[j])
- {
- dis[j] = min+map[k][j];
- }
- }
- }
- }
- void init()
- {
- int i,j;
- for(i = ;i<=n;i++)
- {
- map[i][i] = ;
- for(j = i+;j<=n;j++)
- {
- map[i][j] = map[j][i] = INF;
- }
- }
- while(m--)
- {
- int a,b,w;
- scanf("%d%d%d",&a,&b,&w);
- if(w<map[a][b])//可能有同两点,但不同weight
- {
- map[a][b] = w;
- }
- }
- }
- int main()
- {
- int y;
- while(~scanf("%d%d%d",&n,&m,&y))
- {
- int r,min=INF;
- init();
- scanf("%d",&r);
- while(r--)
- {
- int a;
- scanf("%d",&a);
- map[][a] = ;
- }
- Dijkstra();
- if(dis[y]!=INF)
- printf("%d\n",dis[y]);
- else
- printf("-1\n");
- }
- return ;
- }
思路2:反向图
- #include <cstdio>
- using namespace std;
- const int L = ;
- const int INF = <<;
- int map[L][L];
- int vis[L];
- int dis[L];
- int n,m;
- void Dijkstra(int s)
- {
- int i,j,k;
- int min;
- for(i = ;i<=n;i++)
- {
- dis[i] = map[s][i];
- vis[i] = ;
- }
- vis[s] = ;
- dis[s] = ;
- for(i = ;i<=n;i++)
- {
- min = INF;
- for(j = ;j<=n;j++)
- {
- if(dis[j]<min && !vis[j])
- {
- k = j;
- min = dis[j];
- }
- }
- vis[k] = ;
- for(j = ;j<=n;j++)
- {
- if(dis[j] > min+map[k][j] && !vis[j])
- {
- dis[j] = min+map[k][j];
- }
- }
- }
- }
- void init()
- {
- int i,j;
- for(i = ;i<=n;i++)
- {
- map[i][i] = ;
- for(j = i+;j<=n;j++)
- {
- map[i][j] = map[j][i] = INF;
- }
- }
- while(m--)
- {
- int a,b,w;
- scanf("%d%d%d",&a,&b,&w);
- if(w<map[b][a])//可能有同两点,但不同weight
- {
- map[b][a] = w;
- }
- }
- }
- int main()
- {
- int y;
- while(~scanf("%d%d%d",&n,&m,&y))
- {
- int r,min=INF;
- init();
- Dijkstra(y);
- scanf("%d",&r);
- while(r--)
- {
- int a;
- scanf("%d",&a);
- if(dis[a]<min)
- min = dis[a];
- }
- if(min!=INF)
- printf("%d\n",min);
- else
- printf("-1\n");
- }
- return ;
- }
http://blog.csdn.net/niushuai666/article/details/6794343
这两个思路很值得学习,而且他的两个方法都比我快
HDU 2680(最短路)(多个起始点)的更多相关文章
- HDU - 2680 最短路 spfa 模板
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意,就是一个人可以从多个起点开始出发,看到终点的最短路是多少..只有可以运用和hdu2066 ...
- HDU 2680 最短路 迪杰斯特拉算法 添加超级源点
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- hdu 2680(最短路)
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- UESTC 30 &&HDU 2544最短路【Floyd求解裸题】
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 5521 最短路
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- HDU - 2544最短路 (dijkstra算法)
HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...
- hdu 2680 Choose the best route
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Description One day , Kiki ...
- hdu 2680 Choose the best route (dijkstra算法)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2680 /************************************************* ...
随机推荐
- 苹果笔记本调整 pycharm 字体大小的地方
我想,对于习惯了使用windows版本 或者 乌班图版本 的pycharm 的人而言, mac版本调节字体的地方藏的实在是太坑爹了.
- Python(简单计算器)
参考:https://www.cnblogs.com/alex3714/articles/5169958.html import re ret = re.search('\([^()]+\)','(1 ...
- POJ 2196
#include <iostream> using namespace std; int sum_10; int sum_12; int sum_16; int fun_10(int nu ...
- Mac 10.12安装FTP工具FileZilla
说明:在Windows估计用的比较多,在Linux基本不用了,CRT和Xshell基本可以完成上传. 下载: (链接: https://pan.baidu.com/s/1bpaxmeN 密码: uuw ...
- ubuntu apache2 .htaccess 下配置 反向代理
安装完apache2后, a2enmod rewrite //启用.htaccess规则 a2enmod proxy a2enmod proxy_http //启用反向代理支持 [P] 配置OK,就可 ...
- 将静态网页部署到git上访问
1.将已有的项目放在github上 http://www.cnblogs.com/zqunor/p/6583182.html 2.出现错误解决方案 提交错误 http://blog.csdn.net/ ...
- Oracle练习笔记
1 基本查询 SQL> --当前用户 SQL> show user USER 为 "SCOTT" SQL> --当前用户下的表 SQL> select * ...
- python笔记02-----字符串操作
python中定义变量的字符串 str1 = "www" #str1就是字符串了 一定用引号 或者直接使用"字符串."来调用内部的方法 1.字符串大小 ...
- 深度学习(二)BP求解过程和梯度下降
一.原理 重点:明白偏导数含义,是该函数在该点的切线,就是变化率,一定要理解变化率. 1)什么是梯度 梯度本意是一个向量(矢量),当某一函数在某点处沿着该方向的方向导数取得该点处的最大值,即函数在该点 ...
- ubuntu关闭时间同步与centos更改时间
环境:ubuntu 源于一次项目需要修改系统时间,但是每次修改后又被同步回网络时间,找了好久发现是这个原因: NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于 ...