求助,memset之后,卡在了第三个测试点,改用for 过了,想问 为啥
查看原帖
求助,memset之后,卡在了第三个测试点,改用for 过了,想问 为啥
423006
傻肥狍子楼主2021/8/28 17:07

一开始 我用的memset,后来改用了for, 对这个测试点 输入数据: 5 15 5 2 2 270 1 4 89 2 1 3 5 5 261 5 2 163 5 5 275 4 5 108 4 4 231 3 4 213 3 3 119 3 1 77 3 1 6 2 4 83 5 5 196 5 5 94 输出数据: 166 163 2147483647 246 0 ,如果把初始化dis数组时用memset那句话 输出结果为166 163 2139062143 246 0 这个数据代表我的memset成功了,但是我换成0x7fffffff的时候又都返回负1了,求教

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+6;
const int INF=2147483647;
int n,m,s,cnt;
struct node{
	int u,v,w;
}a[maxn];               //题目所说  记录顶点  端点     以及路程   
int vis[maxn];     		//记录起点 
int dis[maxn]={INF},head[maxn];      //记录起点到每个点的距离     记录图的邻接表
void add(int u,int v,int w){
	a[++cnt].v = v;
	a[cnt].w = w;
	a[cnt].u = head[u];
	head[u] = cnt; 
}
void spfa(int s){
	queue<int> q;
	q.push(s);
	vis[s] = 1;      //代表s已经入队
	dis[s] = 0;      //自己到自己这里当然是0 
	while(!q.empty()){
		int dd = q.front();
		q.pop();
		vis[dd] = 0;  //表示已经出队 
		for(int i=head[dd]; i>0; i=a[i].u){
			if(a[i].w+dis[dd]<dis[a[i].v]){     //当前节点的权值  加上  之前节点的权值 小于 暂时保存的权值  那么我们更新一下  当前的权值  来达到目的 
				dis[a[i].v] = a[i].w+dis[dd];
				if(!vis[a[i].v]){
					q.push(a[i].v);
					vis[a[i].v] = 1;    //代表已经入队 
				}
			}
		}
	} 
}
int main()
{
	cin >>n>>m>>s;
	int z=0;
	for(int i=1; i<=m; i++) 
	{
		int x,y,z;
		cin>>x>>y>>z; 
		add(x,y,z);
	}
//	memset(dis,0x7f,sizeof dis);
	for(int i=1; i<=n; i++) dis[i] = 0x7fffffff; 
//	for(int i=1; i<=n; i++) cout<<dis[i]<<" ";
//	cout<<endl;
	spfa(s);
	for(int i=1; i<=n; i++) 
		if(dis[i]==0x7fffffff) cout<<"2147483647 ";
		else cout<<dis[i]<<" ";
	cout<<endl;
	return 0;
 } 
2021/8/28 17:07
加载中...