Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)

Total Submission(s) : 36   Accepted Submission(s) : 25
Problem Description
某省自从实行了非常多年的畅通project计划后,最终修建了非常多路。只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多。这让行人非常困扰。



如今,已知起点和终点。请你计算出要从起点到终点,最短须要行走多少距离。

 
Input
本题目包括多组数据,请处理到文件结束。每组数据第一行包括两个正整数N和M(0<n<200,0<m<1000),分别代表现有城镇的数目和已修建的道路的数目。

城镇分别以0~n-1编号。 再接下一行有两个整数s,t(0<="S,T<N),分别代表起点和终点。

</div" 接下来是m行道路信息。

每一行有三个整数a,b,x(0<="A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。">

 
Output
对于每组数据。请在一行里输出最短须要行走的距离。

假设不存在从S到T的路线,就输出-1.

 
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
 
Sample Output
2
-1


#include<stdio.h>
#include<string.h>
#define min(a,b) (a)>(b)?(b):(a)
#define INL 10000000
int x[202][202];
int s[202],d[202];
int n,m,q,r;
void Dijkstra()
{
int min,k;
//for(int i=1;i<=n;i++)
memset(s,0,sizeof(s));
for(int i=0;i<n;i++)
d[i]=INL;
d[q]=0;
while(1)
{ k=-1;
for(int j=0;j<n;j++)
if(s[j]==0&&(k==-1||d[j]<d[k]))
k=j;
if(k==-1)
{
break;
}
s[k]=1;
for(int j=0;j<n;j++)
d[j]=min(d[j],d[k]+x[k][j]);
}
if(d[r]==INL)
printf("-1\n");
else
printf("%d\n",d[r]);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)//错写成<span style="font-family: Arial, Helvetica, sans-serif;">while(scanf("%d%d",&n,&m),n|m)</span>
{
int a,b,c,i,j;
for( i=0;i<n;i++)
for( j=0;j<n;j++)
x[i][j]=INL;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(x[a][b]>c)
{
x[a][b]=c;
x[b][a]=c;
}
}
scanf("%d%d",&q,&r);
Dijkstra();
}
return 0;
}

再贴一个

#include<stdio.h>
#include<string.h>
#define M 10000000
#define min(a,b) (a)>(b)?(b):(a)
int map[202][202];
int vis[202],dist[202];
int n,s,t;
void dijkstra()
{
int min,i,j,k;
memset(vis,0,sizeof(vis));
for(i=0; i<n; i++)
dist[i]=map[s][i];
dist[s]=0;
while(1)
{
min=M;
for(j=0; j<n; j++)
if(!vis[j]&&dist[j]<min)
{
min=dist[j];
k=j;
}
if(min==M)break;
vis[k]=1;
for(j=0; j<n; j++)
dist[j]=min(dist[j],dist[k]+map[k][j]);
}
if(dist[t]==M)
printf("-1\n");
else
printf("%d\n",dist[t]);
}
int main()
{
int i,j,x,y,z,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0; i<n; i++)
for(j=0; j<n; j++)
map[i][j]=M; for(i=0; i<m; i++)
{
scanf("%d%d%d",&x,&y,&z); if(map[x][y]>z)
{
map[y][x]=z;
map[x][y]=z;
}
}
scanf("%d%d",&s,&t);
dijkstra();
}
return 0;
}

再贴一个用spfa算法写的。

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct stu{
int one,two,val,next;
};
stu edge[30000];
int N,M,d,f;
int head[30000],t,vid[300],dist[300];
void spfa(int s)
{
queue<int> Q;
memset(dist,0x3f3f3f,sizeof(dist));//这个地方出错了错写成 memset(dist,1000000,sizeof(dist));
memset(vid,0,sizeof(vid));
Q.push(s);
dist[s]=0;
vid[s]=1;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
vid[u]=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].two;
if(dist[v]>dist[u]+edge[i].val)
{
dist[v]=dist[u]+edge[i].val;
if(!vid[v])
{
vid[v]=1;
Q.push(v);
}
}
}
}
if(dist[f]>1000000)
printf("-1\n");
else
printf("%d\n",dist[f]);
}
void get(int a,int b,int c)
{
stu E={a,b,c,head[a]};
edge[t]=E;
head[a]=t++;
}
int main()
{
while(scanf("%d%d",&N,&M)!=EOF)
{
t=0;
memset(head,-1,sizeof(head));
int a,b,c;
while(M--)
{
scanf("%d%d%d",&a,&b,&c);
get(a,b,c),get(b,a,c);
}
scanf("%d%d",&d,&f);
spfa(d);
}
return 0;
}

再贴一个spfa算法写的代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#define INL 0x3f3f3f3f//有时候写成0x3f3f3f时会出错再加一个3f就正确了。
#include<algorithm>
using namespace std;
struct stu{
int one,two,val,next;
};
stu edge[30000];
int head[30000],t,he,vid[300],vist[300];
void get(int u,int v,int w)
{
stu E={u,v,w,head[u]};
edge[t]=E;
head[u]=t++;
}
void SPFA(int s)
{
queue<int> q;
memset(vist,INL,sizeof(vist));
memset(vid,0,sizeof(vid));
q.push(s);
vist[s]=0;
vid[s]=1;//这个地方错写成vid[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
vid[u]=0;//敲代码时这个地方漏掉了
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].two;
if(vist[v]>vist[u]+edge[i].val)
{
vist[v]=vist[u]+edge[i].val;
if(!vid[v])
{
q.push(v);
vid[v]=1;
}
}
}
}
if(vist[he]==INL)//还有一种写法if(vist[he]>100000)
printf("-1\n");
else
printf("%d\n",vist[he]);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
t=0;
int i,j,k,a,b,c;
memset(head,-1,sizeof(head));//这个出错了
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
get(a,b,c);
get(b,a,c);
}
scanf("%d%d",&a,&he);
SPFA(a);
}
return 0;
}

畅通project续的更多相关文章

  1. hdoj 1874 畅通project续【SPFA】

    畅通project续 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  2. HDU1874畅通project续 dijkstra&amp;&amp;floyd

    畅通project续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Time Limit: 3000/1000 MS (Java/Others)    ...

  3. hdu1874 畅通project续(求最短路径)

    畅通project续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. HDU 1874 畅通project续 (最短路径)

    畅通project续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. HDOJ 1874 畅通project续

    畅通project续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU 1874 畅通project续 最短路径入门(dijkstra)

    Problem Description 某省自从实行了非常多年的畅通project计划后,最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案 ...

  7. 畅通project续HDU杭电1874【dijkstra算法 || SPFA】

    http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多 ...

  8. hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

    Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案 ...

  9. 【floyd】HDU 1874 畅通project续

    之后的题解偏重有用/总结性质,尽量理解算法本身而不是题,时间复杂度什么的也能够放放. 非常久之前做过这个题,当时使用dijkstra做的,关于几个最短路算法,分类的话能够分为下面几种. 1.单源最短路 ...

随机推荐

  1. 【转】Delphi 2010 Lite加装帮助文件

    基于爱好,下载了一个delphi 2010 lite,业余玩玩. 不过这东西是网友重新打包的,没有带帮助.在网上搜索一下加摸索后搞定.步骤如下: Delphi 2010本身的帮助(MSDN风格的)1. ...

  2. 已安全化的ActiveX控件卸载时出现"DllUnregisterServer函数出错,错误代码:0x80070002"问题解决

    已安全化的ActiveX控件卸载时出现"DllUnregisterServer函数出错,错误代码:0x80070002"问题解决   情况一:当该控件未注册或者已经卸载时,你尝试卸 ...

  3. QT +菜单栏和工具栏

    #include "mainwindow.h" #include <QMenuBar>//菜单栏需要的头文件 #include <QMenu>//菜单 #i ...

  4. github 从一个仓库换到另一个仓库

    1.找到.git目录   2.打开config文件 3.修改仓库地址 4.重新提交 git push --all origin 这样就替我们的项目换仓啦!!!^_^

  5. Maven实战读书笔记(二):Maven坐标与仓库

    2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...

  6. 【mybatis】mybatis数据源源码剖析(JNDI、POOLED、UNPOOLED)

    一.概述 二.创建 mybatis数据源的创建过程稍微有些曲折. 1. 数据源的创建过程: 2. mybatis支持哪些数据源,也就是dataSource标签的type属性可以写哪些合法的参数? 弄清 ...

  7. Vue通信、传值的多种方式,详解

    Vue通信.传值的多种方式,详解 转自:https://blog.csdn.net/qq_35430000/article/details/79291287 一.通过路由带参数进行传值 ①两个组件 A ...

  8. 删除mysql中user为空用户,mysql空密码

    进入mysql数据库 mysql -uroot -p 查看用户信息 select user,host ,Password from mysql.user; 如下图: 删除user为空用户 delete ...

  9. Springboot整合Shiro安全框架

    最近在学习Springboot,在这个过程中遇到了很多之前都没有技术知识,学习了一阵子,稍微总结一些. ---- Shiro框架 shiro框架,是一个相对比较简便的安全框架,它可以干净利落地处理身份 ...

  10. 深入Linux内核架构——进程管理和调度(下)

    五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进 ...