一个人的旅行(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 ...
随机推荐
- Linux基本操作 2-----Linux文件系统基本结构
Linux的文件系统结构 Linux文件系统为一个倒转的单根树状结构 文件系统的根为"/" 文件系统严格区分大小写 路径使用“/”来分割,在windows使 ...
- [Hapi.js] POST and PUT request payloads
hapi makes handling POST and PUT payloads easy by buffering and parsing them automatically without r ...
- [ES7] Object.observe + Microtasks
ES6: If you know about the Javascirpt's event loop. You know that any asyns opreations will be throw ...
- 为项目编写Readme.MD文件
了解一个项目,恐怕首先都是通过其Readme文件了解信息.如果你以为Readme文件都是随便写写的那你就错了.github,oschina git gitcafe的代码托管平台上的项目的Readme. ...
- SQLSERVER执行时间统计工具SQLQueryStress
有时候需要检测一下SQL语句的执行时间,相信大家都会用SET STATISTICS TIME ON开关打开SQLSERVER内置的时间统计 SET STATISTICS TIME ON 不过这款小工具 ...
- Windows Phone 学习教程(一)
http://www.cnblogs.com/webabcd/category/385852.html Windows Phone 7 教程 Windows Phone 8.1 Windows Pho ...
- redhat换yum源
根据redhat操作系统版本及位数,下载对应centos的版本及位数的这些包: yum-3.2.22-40.el5.centos.noarch.rpm yum-fastestmirror-1.1.16 ...
- enumerateObjectsUsingBlock VS for(... in ...)
enumerateObjectsUsingBlock VS for(... in ...) for(... in ...)用起来非常方便.简洁,同时enumerateObjectsUsingBlock ...
- OAuth协议与第三方登录:(QQ,百度,微信,微博)
OAuth 相当于授权的U盾,提供第三方认证的协议,是个安全相关的协议,作用在于,使用户授权第三方的应用程序访问用户的web资源,并且不需要向第三方应用程序透露自己的密码. 传统互联网:应用于PC端, ...
- C++程序设计实践指导1.14字符串交叉插入改写要求实现
改写要求:1:以指针为数据结构开辟存储空间 改写要求2:被插入字符串和插入字符串不等长,设计程序间隔插入 如被插入字符串长度为12,待插入字符串长度为5 则插入间隔为2 改写要求3:添加函数Inser ...