一开始 我用的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;
}