AC Dij,细节求问
查看原帖
AC Dij,细节求问
797783
noisynoob楼主2023/10/19 23:04

本来的代码hack了 #4 #5 #7

然后看了半天题解看不出什么猫腻 闲的没事看见题解的dij主体处循环写的比我的巧妙,就改了玩玩,歪打正着解决了问题

但是并不完全理解这俩为什么会导致结果不一,求问 (虽然直接背上就行了23333)

AC Code

#include<bits/stdc++.h>
using namespace std;

const int Max=10005;
const int INF=2147483647;

int n,m,s;
unsigned int dis[Max];
struct node{
	unsigned int nex,val;
};
vector <node> e[Max];
bool vis[Max]; 

int main(){
	cin>>n>>m>>s;
	for(int i=0;i<m;++i){
		int uu;node vv;
		cin>>uu>>vv.nex>>vv.val;
		e[uu].push_back(vv);
	}
	
	for(int i=1;i<=n;++i)
		dis[i]=INF;
	for(int i=0;i<e[s].size();++i){
		dis[e[s][i].nex]=e[s][i].val;
	}
	dis[s]=0;
	int u=s;

//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
	while(!vis[u]){
		unsigned int minn=INF;
		for(int v=0;v<e[u].size();++v){
			if(!vis[e[u][v].nex]&&dis[e[u][v].nex]>e[u][v].val+dis[u]){
				dis[e[u][v].nex]=e[u][v].val+dis[u];
			}
		}
				
		vis[u]=1;
		for(int j=1;j<=n;++j){
			if(!vis[j]&&dis[j]<minn){
				minn=dis[j];
				u=j;
			}
		}

	}
	
	for(int i=1;i<=n;++i)
		cout<<dis[i]<<' ';
	//	printf("%d ",dis[i]);
	
	return 0;
}

-------分割线----------

WA Code

#include<bits/stdc++.h>
using namespace std;

const int Max=100005;
const int INF=2147483647;

int n,m,s;
unsigned int dis[Max];
struct node{
	unsigned int nex,val;
};
vector <node> e[Max];
bool vis[Max]; 

int main(){
	cin>>n>>m>>s;
	for(int i=0;i<m;++i){
		int uu;node vv;
		cin>>uu>>vv.nex>>vv.val;
		e[uu].push_back(vv);
	}
	
	for(int i=1;i<=n;++i)
		dis[i]=INF;
	for(int i=0;i<e[s].size();++i){
		dis[e[s][i].nex]=e[s][i].val;
	}
	vis[s]=1,dis[s]=0;
	
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
//问题就在下面的循环条件
	for(int i=1;i<n;++i){
		int min=INF,u=s;
		for(int j=1;j<=n;++j){
			if(!vis[j]&&dis[j]<min){
				min=dis[j];
				u=j;
			}
		}
		vis[u]=1;
		for(int v=0;v<e[u].size();++v){
			if(dis[e[u][v].nex]>e[u][v].val+dis[u]){
				dis[e[u][v].nex]=e[u][v].val+dis[u];
			}
		}
	}
	
	for(int i=1;i<=n;++i)
		cout<<dis[i]<<' ';
	//	printf("%d ",dis[i]);
	
	return 0;
}
2023/10/19 23:04
加载中...