pre.
#include<cstring> #include<cstdio> #include<queue> using namespace std; const int maxn=1e6+10; struct Edge{int u,v,w;}edge[2*maxn]; int head[maxn],cnt; inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;} int dis[maxn]; int n,m,s,u,v,w; inline void dijkstra(int s) { // memset(dis,0x7f,sizeof(dis)); for(int i=1;i<=n;i++)dis[i]=2147483647; priority_queue<pair<int,int> > q;//pair<dis,point> q.push(make_pair(0,s)),dis[s]=0; while(!q.empty()) { pair cur=q.front(),q.pop(); for(int i=cur.second,;i;i=edge[i].u) { int v=edge[i].v; if(dis[v]>dis[cur]+edge[i].w) dis[v]=dis[cur]+edge[i].w,q.push(make_pair(dis[cur]+edge[i].w,v)); } } for(int i=1;i<=n;i++) printf("%d ",dis[i]); } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); } dijkstra(s); return 0; }
#include<cstring> #include<cstdio> #include<queue> using namespace std; const int maxn=1e6+10; struct Edge{int u,v,w;}edge[2*maxn]; int head[maxn],cnt; inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;} int dis[maxn]; int n,m,s,u,v,w; inline void dijkstra(int s) { // memset(dis,0x7f,sizeof(dis)); for(int i=1;i<=n;i++)dis[i]=2147483647; priority_queue<pair<int,int> > q;//pair<dis,point> q.push(make_pair(0,s)),dis[s]=0; while(!q.empty()) { pair<int,int>cur=q.top();q.pop(); for(int i=cur.second;i;i=edge[i].u) { int v=edge[i].v; if(dis[v]>dis[cur.second]+edge[i].w) dis[v]=dis[cur.second]+edge[i].w,q.push(make_pair(dis[cur.second]+edge[i].w,v)); } } for(int i=1;i<=n;i++) printf("%d ",dis[i]); } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); } dijkstra(s); return 0; }
上面的代码是信息课上随手写的,当然是不过了,连样例都不过。
重写一份。
是忘记写head了。
堆优化Dijkstra:
#include<cstring> #include<cstdio> #include<queue> using namespace std; const int maxn=1e6+10; struct Edge{int u,v,w;}edge[2*maxn]; int head[maxn],cnt; inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;} int n,m,s,u,v,w; int dis[maxn],vis[maxn]; inline void dijkstra(int s) { fill(dis,dis+maxn,2147483647),fill(vis,vis+maxn,0); typedef pair<int,int> sta; priority_queue<sta,vector<sta>,greater<sta> > q; q.push((sta){0,s}),dis[s]=0; while(!q.empty()) { sta cur=q.top();vis[cur.second]=0,q.pop(); for(int i=head[cur.second];i;i=edge[i].u) { int v=edge[i].v; if(dis[v]>dis[cur.second]+edge[i].w) { dis[v]=dis[cur.second]+edge[i].w; if(!vis[v])vis[v]=1,q.push((sta){dis[v],v}); } } } for(int i=1;i<=n;i++)printf("%d ",dis[i]); } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=0;i<m;i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w); dijkstra(s); return 0; }
#include<cstdio> #include<queue> #include<cstring> #define maxn 1000001 using namespace std; struct Edge{int u,v,w;}edge[2*maxn]; int head[maxn],cnt; int n,m,s,u,v,w; int vis[maxn],dis[maxn],cur,nxt; inline void add(int u,int v,int w){edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;} inline void spfa(int u) { queue<int>q; fill(dis,dis+maxn,2147483647),fill(vis,vis+maxn,0),dis[u]=0,vis[u]=true,q.push(u); while(!q.empty()) { cur=q.front(),vis[cur]=0,q.pop(); for(int i=head[cur]; i; i=edge[i].u) { int v=edge[i].v; if(dis[v]>dis[cur]+edge[i].w) { dis[v]=dis[cur]+edge[i].w; if(!vis[v])vis[v]=1,q.push(v); } } } for(int i=1;i<=m;i++)printf("%d ",dis[i]); } int main() { scanf("%d%d%d",&m,&n,&s); for(int i=0; i<n; i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w); spfa(s); return 0; }
速度差不多,代码量也差不多。做个测试。