邻接表存图。。。

#include<iostream> #include<cstring> #include<queue> #include<cstdio> using namespace std; #define INF 0x7FFFFFFF #define N 150000 #define M 2000000 typedef struct node { int u; int len; struct node *nex; }NODE; NODE edg[M],*head[N]; int hh[N],dis[N]; int cnt,n; void init() { int i; cnt=0; for(i=0;i<=n;i++) { head[i]=0; hh[i]=0; dis[i]=INF; } } void insert(int a,int b,int c) { edg[cnt].u=b; edg[cnt].len=c; edg[cnt].nex=head[a]; head[a]=&edg[cnt++]; } int SPFA() { int i,j; int t; queue<int>que; hh[1]=1; dis[1]=0; que.push(1); while(!que.empty()) { t=que.front(); que.pop(); hh[t]=0; for(NODE *p=head[t]; p ; p=p->nex) { if(dis[p->u]>dis[t]+p->len) { dis[p->u]=dis[t]+p->len; if(hh[p->u]==0) { que.push(p->u); hh[p->u]=1; } } } } return dis[n]; } int main() { int i,j; int a,b,c; int m; while(~scanf("%d%d",&n,&m)) { init(); while(m--) { scanf("%d%d%d",&a,&b,&c); insert(a,b,c); } printf("%d\n",SPFA()); } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值