我的dijksta哪里写错了

oldwong77 2017-09-12 08:32:30
杭电2544最短路,dijkatra哪里写错了。。。
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
#define maxn 300

int n,m;
int mp[maxn][maxn];
int vis[maxn],dis[maxn];

void dijkstra(){
int i,j,pos,min;
int s=1; //源点是1路口
memset(vis,0,sizeof(vis));
dis[s]=0,vis[s]=1;
//dis[i]记录源点到点i之间的距离
for(i=1;i<=n;i++)
dis[i]=mp[s][i];
for(i=1;i<=n;i++){
min=inf;
//每一次找到还未访问,也就是在集合外的点到源点的最小距离
for(j=1;j<=n;j++){
if(dis[j]<min &&!vis[j]){
pos=j;
min=dis[j];
}
}
vis[pos]=1;
for(j=1;j<=n;j++){
//进行松弛
if(dis[j]>dis[pos]+mp[pos][j] ){
dis[j]=dis[pos]+mp[pos][j];
}
}
}
}

int main(){
int i,j,u,v,w;
while(~scanf("%d%d",&n,&m)){ //n个路口,m条边
if(n==0&&m==0) break;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
mp[i][j]=inf;
mp[i][i]=0;
}
for(i=0;i<m;i++){
scanf("%d%d%d%d",&u,&v,&w);
if(mp[u][v]>w) //防止重路
mp[u][v]=mp[v][u]=w;
}
dijkstra();
printf("%d\n",dis[n]);
}
return 0;
}

...全文
117 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldwong77 2017-09-14
  • 打赏
  • 举报
回复
谢谢大家,错误找到了。
赵4老师 2017-09-13
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
赵4老师 2017-09-12
  • 打赏
  • 举报
回复
百度搜相关关键字。
zycxnanwang 2017-09-12
  • 打赏
  • 举报
回复
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
#define maxn 300

int n,m;
int mp[maxn][maxn];
int vis[maxn],dis[maxn];

void dijkstra(){
	int i,j,pos,min;
	int s=1; //源点是1路口
	memset(vis,0,sizeof(vis));
	dis[s]=0,vis[s]=1;
	//dis[i]记录源点到点i之间的距离
	for(i=1;i<=n;i++) dis[i]=mp[s][i];
		
	for(i=1;i<=n;i++){
		min=inf;
		//每一次找到还未访问,也就是在集合外的点到源点的最小距离
		for(j=1;j<=n;j++){
			if(dis[j]<min &&!vis[j]){
				pos = j;
				min = dis[j]; 
			}
		}
		
		vis[pos]=1;
		for(j=1;j<=n;j++){
			//进行松弛
			if(dis[j]>dis[pos]+mp[pos][j] ){
				dis[j]=dis[pos]+mp[pos][j];
			}
		}
	}
}

int main(){
	int i,j,u,v,w;
	while(~scanf("%d%d",&n,&m)){ //n个路口,m条边
		if(n==0&&m==0) break;
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++)
			mp[i][j]=inf;
			mp[i][i]=0;
		}
		
		for(i=0;i<m;i++){
			scanf("%d%d%d",&u,&v,&w);
			//if(mp[u][v]>w)  //防止重路
			mp[u][v]=mp[v][u]=w;
		}
		
		dijkstra();
		printf("%d\n",dis[n]);
	}
	return 0;
}
scanf("%d%d%d%d",&u,&v,&w); 你写了四个%d 还有就是那个防止重路那句删除了

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧