Uva(10986)
来源:互联网 发布:iphone桌面软件管理 编辑:程序博客网 时间:2024/06/03 17:41
很裸的一道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 99999999struct 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; }
0 0
- uva 10986
- uva 10986
- Uva(10986)
- uva 10986 - Sending email
- UVA 10986 - Sending email
- UVA 10986 By ACReaper
- UVa:10986 Sending email
- UVA - 10986 Sending email
- UVa 10986 - Sending email
- UVa 10986 - Sending email
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- 10369 - Arctic Network
- prim算法
- C-Lodop工作原理
- 10099 The Tourist Guide
- hdu2066(迪杰斯特拉算法模板)
- Uva(10986)
- 嵌入式系统
- Uva 558Wormholes
- sencha touch下拉刷新上拉加载实现
- Uva10806
- Uva(10330)
- 串口通信的相关概念和理解原理
- Uva753
- Uva11045