一个人的旅行(floyd+dijskra+SPFA+Bellman)
一个人的旅行
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23416 Accepted Submission(s): 8154
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
#include<stdio.h>
#include<string.h>
#define MIN(x,y)(x<y?x:y)
const int INF=0x3f3f3f3f;
const int MAXN=;
int T,S,D,used[MAXN];
int map[MAXN][MAXN],s[MAXN],e[MAXN];
int main(){
int a,b,c;
while(~scanf("%d%d%d",&T,&S,&D)){
memset(used,,sizeof(used));
for(int i=;i<=MAXN;i++)
for(int j=;j<=MAXN;j++)
if(i-j)map[i][j]=INF;
else map[i][j]=;
while(T--){
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b])map[a][b]=map[b][a]=c;
used[a]++;used[b]++;
}
for(int k=;k<MAXN;k++){
if(!used[k])continue;
for(int i=;i<MAXN;i++){
if(map[i][k]==INF)continue;
for(int j=;j<MAXN;j++){
map[i][j]=MIN(map[i][j],map[i][k]+map[k][j]);
}
}
}
for(int i=;i<S;i++){
scanf("%d",&s[i]);
}
for(int i=;i<D;i++){
scanf("%d",&e[i]);
}
int ans=INF;
for(int i=;i<S;i++)
for(int j=;j<D;j++)
ans=MIN(ans,map[s[i]][e[j]]);
printf("%d\n",ans);
}
return ;
}
dijskra代码:
#include<stdio.h>
#include<string.h>
#define MIN(x,y)(x<y?x:y)
const int INF=0x3f3f3f3f;
const int MAXN=;
int map[MAXN][MAXN];
int vis[MAXN],d[MAXN];
int N,begin[MAXN],end[MAXN];
void initial(){
//memset(map,INF,sizeof(map));
memset(vis,,sizeof(vis));
memset(d,INF,sizeof(d));
}
void dijskra(int s){
initial();
d[s]=;
int k;
while(true){
k=-;
for(int i=;i<=;i++){
if(!vis[i]&&(k==-||d[i]<d[k]))k=i;
}
if(k==-)break;
vis[k]=;
for(int i=;i<=;i++){
d[i]=MIN(d[i],d[k]+map[k][i]);
}
}
}
int main(){
int T,S,D;
int a,b,c,temp;
while(~scanf("%d%d%d",&T,&S,&D)){
memset(map,INF,sizeof(map));
while(T--){
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b])map[a][b]=map[b][a]=c;
}
int ans=INF;
for(int i=;i<S;i++)scanf("%d",&begin[i]);
for(int i=;i<D;i++)scanf("%d",&end[i]);
for(int i=;i<S;i++){
dijskra(begin[i]);
for(int j=;j<D;j++){
// printf("%d\n",temp);
ans=MIN(ans,d[end[j]]);
}
}
printf("%d\n",ans);
}
return ;
}
SPFA
#include<stdio.h>
#include<string.h>
#include<queue>
#define MIN(x,y) (x<y?x:y)
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=;
const int MAXM=;
int head[MAXM];
struct Edge{
int from,to,value,next;
};
Edge edg[MAXM];
int T;
int S;
int D;
int enu;
int s[MAXN],e[MAXN];
int vis[MAXN],dis[MAXN],used[MAXN];
queue<int>dl;
void initial(){
memset(dis,INF,sizeof(dis));
memset(vis,,sizeof(vis));
while(!dl.empty()){
dl.pop();
}
}
void SPFA(int sx){
initial();
vis[sx]=;dis[sx]=;dl.push(sx);
while(!dl.empty()){
int k=dl.front();
dl.pop();
vis[k]=;
for(int i=head[k];i!=-;i=edg[i].next){
int v=edg[i].to;
if(dis[k]+edg[i].value<dis[v]){
dis[v]=dis[k]+edg[i].value;
if(!vis[v])
dl.push(v),vis[v]=;
}
}
}
}
void add(int u,int v,int value){
Edge E={u,v,value,head[u]};
edg[enu]=E;
head[u]=enu++;
}
void get(){
int a,b,c;
while(T--){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
for(int i=;i<S;i++)scanf("%d",&s[i]);
for(int i=;i<D;i++)scanf("%d",&e[i]);
}
void print(){
int ans=INF;
for(int i=;i<S;i++){
SPFA(s[i]);
for(int j=;j<D;j++){
ans=MIN(ans,dis[e[j]]);
}
}
printf("%d\n",ans);
}
int main(){
while(~scanf("%d%d%d",&T,&S,&D)){
memset(head,-,sizeof(head));
enu=;
get();
print();
}
return ;
}
Bellman+剪枝:14ms水过;
#include<stdio.h>
#include<string.h>
#define MIN(x,y)(x<y?x:y)
const int INF=0x3f3f3f3f;
const int MAXN=;
const int MAXM=;
int dis[MAXN],s[MAXN],e[MAXN],used[MAXN];
struct Node{
int s,e,dis;
};
Node dt[MAXM];
int T,S,D,top,ans;
void Bellman(){
int u,v,w;
memset(dis,INF,sizeof(dis));
for(int i=;i<S;i++)dis[s[i]]=;
for(int j=;j<MAXN;j++){
if(!used[j])continue;
for(int i=;i<top;i++){
u=dt[i].s;v=dt[i].e;w=dt[i].dis;
dis[v]=MIN(dis[v],dis[u]+w);
}
}ans=INF;
for(int i=;i<D;i++)ans=MIN(dis[e[i]],ans);
printf("%d\n",ans);
}
int main(){
int a,b,c;
while(~scanf("%d%d%d",&T,&S,&D)){
top=;
memset(used,,sizeof(used));
while(T--){
scanf("%d%d%d",&a,&b,&c);
dt[top].s=a;dt[top].e=b;dt[top++].dis=c;
dt[top].s=b;dt[top].e=a;dt[top++].dis=c;
used[a]++;used[b]++;
}
for(int i=;i<S;i++)scanf("%d",&s[i]);
for(int i=;i<D;i++)scanf("%d",&e[i]);
Bellman();
}
return ;
}
一个人的旅行(floyd+dijskra+SPFA+Bellman)的更多相关文章
- 最短路(dijskra+SPFA+Bellman)
最短路 Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- 六度分离(floyd算法+dijskra+SPFA)
六度分离 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Wormholes(SPFA+Bellman)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36860 Accepted: 13505 Descr ...
- 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)
Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i ...
- 畅通工程续(dijskra+SPFA)
畅通工程续 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- ZOJ 2770 Burn the Linked Camp(spfa&&bellman)
//差分约束 >=求最长路径 <=求最短路径 结果都一样//spfa#include<stdio.h> #include<string.h> #include< ...
- Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template
Dijkstra in Adjacency matrix : int Dijkstra(int src,int tec, int n){ ]; ]; memset(done,,sizeof(done) ...
- Nyoj Arbitrage(Floyd or spfa or Bellman-Ford)
描述Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a curren ...
- 最短路问题 Floyd+Dijkstra+SPFA
参考博客:https://blog.csdn.net/qq_35644234/article/details/60875818 题目来源:http://acm.hdu.edu.cn/showprobl ...
随机推荐
- pyqt QTableView例子学习
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import * from Py ...
- JUnit4基础 使用JUnit4进行单元测试
JUnit 4全面引入了Annotation来执行我们编写的测试. 关于JUnit 3的使用可以参见:http://www.cnblogs.com/mengdd/archive/2013/03/26/ ...
- android CMWAP, CMNET有何差别
什么是CMNET,什么是CMWAP? 答:CMWAP和CMNET仅仅是中国移动为其划分的两个GPRS接入方式.中国移动对CMWAP作了一定的限制,主要表如今CMWAP接入时仅仅能訪问GPRS网络内的I ...
- Dalvik虚拟机的运行过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8914953 在前面一篇文章中,我们分析了Dal ...
- thinkphp框架的路径问题 - 总结
thinkphp框架的路径问题 - 总结 (2011-06-21 11:01:28) 转载▼ 标签: thinkphp 框架 路径 杂谈 分类: Php TP中有不少路径的便捷使用方法,比如模板中使用 ...
- Apache与tomcat
联系 1)Apache和tomcat都是web网络服务器 2)Apache是普通的服务器,本身支持html即普通网页,可以通过插件支持php也可以与Tomcat连通 (Apache单向连接tomca ...
- 触摸点为scrollview上的子控件时,scrollview不能滚动(iOS8)
现象:在iOS8上,scrollview上面布局了多行多列的button,滑动scrollview,如果当触摸点是在按钮上,scrollview不能滚动. 例如: 解决方法:设置scrollview的 ...
- document.write 存在几个问题?应该注意
document.write (henceforth DW) does not work in XHTML XHTML 不支持 DW executed after the page has finis ...
- Ext树控件第一次勾选父节点子节点没选中
项目中同事提出了这样一个bug 问题: 第一次勾选父节点子节点竟然没选中,逆天了啊 初步分析: 可能是之前代码的逻辑错误造成的,随进入调试阶段... 调试中发现该参数为空(原来写代码的也太没素质了), ...
- IOS自适应库---- Masonry的使用
Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X.Masonry是一个用代码写iOS或OS ...