Uva(10986)
很裸的一道dijk算法题,因为顶点数太多无法用邻接矩阵表示,所以要用临界表来表示
AC代码
#include<stdio.h> #include<string.h> #include<queue> #include<vector> #include<iostream> #include<algorithm> using namespace std; using namespace std; const int maxn=2*50000; #define inf 99999999 struct node { int v; int u; int w; int next; }V[maxn]; int head[maxn]; int d[maxn]; int n,m,s,t; int tol; int done[maxn]; typedef pair<int,int>pii; priority_queue<pii,vector<pii>,greater<pii> >q; void init() { tol=0; memset(head,-1,sizeof(head)); } void dijk() { memset(done,0,sizeof(done)); for(int i=0;i<=n;i++) d[i]=inf; d[s]=0; q.push(make_pair(d[s],s)); while(!q.empty()) { pii u=q.top(); q.pop(); int x=u.second; if(done[x]) continue; done[x]=1; for(int e=head[x];e!=-1;e=V[e].next) { int v=V[e].v; int w=V[e].w; if(d[x]+w<d[v]) { d[v]=d[x]+w; q.push(make_pair(d[v],v)); } } } if(d[t]==inf) printf("unreachable\n"); else printf("%d\n",d[t]); } int main() { int T; int tmp=0; scanf("%d",&T); while(T--) { scanf("%d %d %d %d",&n,&m,&s,&t); init(); m*=2; int u,v,w; for(int i=0;i<m;i+=2) { scanf("%d %d %d",&u,&v,&w); V[i].u=u; V[i].v=v; V[i].w=w; V[i].next=head[u]; head[u]=i; V[i+1].u=v; V[i+1].v=u; V[i+1].next=head[v]; V[i+1].w=w; head[v]=i+1; } printf("Case #%d: ",++tmp); dijk(); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步