我没用堆优化,自己写的是什么都不太清楚,竟然过了弱化版……
各位都是怎么写的Dij啊,求教
下面是我的代码:
#include<iostream>
#include<climits>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=10002;
const int MAXM=500002;
const int INF=INT_MAX;
int n,m,s;
int first[MAXN],d[MAXN],p[MAXN];
bool vis[MAXN];
int u[MAXM],v[MAXM],w[MAXM],nex[MAXM];
void read_graph(){
memset(w,-1,sizeof(w));
memset(nex,-1,sizeof(nex));
memset(first,-1,sizeof(first));
cin>>n>>m>>s;
for(int i=1;i<=n;i++) first[i]=-1;
for(int e=1;e<=m;e++){
int z;
cin>>u[e]>>v[e]>>z;
if(w[e]==-1 || z<w[e]) w[e]=z;
nex[e]=first[u[e]];
first[u[e]]=e;
}
}
void Dijkstra(){
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++){
if(i==s) d[i]=0;
else d[i]=INF;
}
for(int i=1;i<=n;i++){
int x,a=INF;
for(int y=1;y<=n;y++){
if(!vis[y] && d[y]<=a){
a=d[y],x=y;
}
}
vis[x]=true;
int e=first[x];//
while(e!=-1){
int l=u[e],r=v[e];
if(w[e]!=-1 && d[l]+w[e]>=0 && d[r]>d[l]+w[e]){
d[r]=d[l]+w[e];
p[r]=l;
}
e=nex[e];
}//
}
}
int main()
{
read_graph();
Dijkstra();
for(int i=1;i<=n;i++){
cout<<d[i]<<' ';
}
return 0;
}
read_graph()
是按照书上写的,但代码中加斜杠的一大段都是根据自己想法写的(书上没有),请问这样真的是对的吗
还有我这个是属于邻接表还是链式前向星啊,非常感谢!