一个人的旅行(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 ...
随机推荐
- JQuery 选择器 *很重要 多记
1)基本选择器: 跟CSS选择器类似 2) 层次选择器 div>span 紧接这div同一级下的全部span .one+div 同一等级的div #two~div 同一等级di ...
- 《招聘一个靠谱的iOS》面试题参考答案(下)
相关文章: <招聘一个靠谱的iOS>面试题参考答案(上) 说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外 ...
- Dalvik虚拟机简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...
- cookie那些事
本文面向对cookie有基本了解的读者,小白出门左转 设置cookie (HTTP 响应头) Set-Cookie: {name}={value};path={path};domain={doma ...
- FullCalendar 的学习笔记(一)
前一段时间,一个老项目需要新增一个小功能,日程表~ 于是网上找了下,发现FullCalendar这个控件还不错于是就拿来用了下,下面简单介绍下我的学习笔记. 首先就是了解下FullCalendar的A ...
- 用GDAL/OGR去读shapefile
一.读shapefile 1.首先,用Arcgis创建所要读的shp文件.打开ArcCatalog,右键NEW->Shapefile,名称Name:point ,要素类型(Feature Typ ...
- python-整理-logging日志
python的日志功能模块是logging 功能和使用方式非常类似于log4 如何使用logging: # 导入日志模块import logging# 使用配置文件设置日志时,需要导入这个模块 imp ...
- 实现TCP断点上传,后台C#服务实现接收
实现TCP断点上传,后台C#服务实现接收 终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的是Http来实现, ...
- 用lsb_release -a 查看linux版本
1.要通过yum 安装上这个命令的软件包 yum -y install redhat-lsb 2.lsb_release -a 查看linux版本信息
- Typecho 代码阅读笔记(三) - 插件机制
转载请注明出处:http://blog.csdn.net/jh_zzz 以 index.php 为例: /** 初始化组件 */ Typecho_Widget:: widget('Widget_Ini ...