poj 1511
来源:互联网 发布:中国财团知乎 编辑:程序博客网 时间:2024/06/09 13:25
http://poj.org/problem?id=1511
最短路问题
dijkstra邻接表+优先队列算法
正面算一次,反图算一次
题目明明说的不超long long
全部改成long long 才过
代码:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <stack>#include <iostream>#include <vector>#include <queue>using namespace std;const long long maxn =1000000001;long long first[1000005];long long next[1000005];long long Nfirst[1000005];long long Nnext[1000005];long long v[1000005];long long u[1000005];long long w[1000005];long long p,q;long long d[1000005];long long down[1000005];long long sum;typedef pair<long long,long long> pii;priority_queue<pii,vector<pii>,greater<pii> > que;long long init(){ for(long long i=1;i<=p;i++) first[i]=Nfirst[i]=-1; for(long long i=1;i<=q;i++) next[i]=Nnext[i]=-1; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down)); while(!que.empty()) que.pop();}long long dijkstra(){ while(!que.empty()) que.pop(); que.push(make_pair(d[1],1)); while(!que.empty()) { pii k=que.top(); que.pop(); long long x=k.second; if(down[k.second]==1) continue; down[k.second]=1; for(long long e=first[x];e!=-1;e=next[e]) { if(d[v[e]]>d[x]+w[e]) { d[v[e]]=d[x]+w[e]; que.push(make_pair(d[v[e]],v[e])); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i]; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down)); return 1;}long long Ndijkstra(){ while(!que.empty()) que.pop(); que.push(make_pair(d[1],1)); while(!que.empty()) { pii k=que.top(); que.pop(); long long x=k.second; if(down[k.second]==1) continue; down[k.second]=1; for(long long e=Nfirst[x];e!=-1;e=Nnext[e]) { if(d[u[e]]>d[x]+w[e]) { d[u[e]]=d[x]+w[e]; que.push(make_pair(d[u[e]],u[e])); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i];}int main(){ long long T; scanf("%I64d",&T); while(T--) { sum=0; scanf("%I64d%I64d",&p,&q); init(); for(long long i=1;i<=q;i++) { scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]); next[i]=first[u[i]]; first[u[i]]=i; Nnext[i]=Nfirst[v[i]]; Nfirst[v[i]]=i; } dijkstra(); Ndijkstra(); printf("%I64d\n",sum); } return 0;}
SPFA算法
好像就一个用队列,一个用优先队列的区别
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <stack>#include <iostream>#include <vector>#include <queue>using namespace std;const long long maxn =1000000001;long long first[1000005];long long next[1000005];long long Nfirst[1000005];long long Nnext[1000005];long long v[1000005];long long u[1000005];long long w[1000005];long long p,q;long long d[1000005];long long down[1000005];long long sum;queue<long long> que;long long init(){ for(long long i=1;i<=p;i++) first[i]=Nfirst[i]=-1; for(long long i=1;i<=q;i++) next[i]=Nnext[i]=-1; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down));}long long dijkstra(){ while(!que.empty()) que.pop(); que.push(1); down[1]=1; while(!que.empty()) { long long x=que.front(); que.pop(); down[x]=0; for(long long e=first[x];e!=-1;e=next[e]) { if(d[v[e]]>d[x]+w[e]) { d[v[e]]=d[x]+w[e]; if(down[v[e]]==0) que.push(v[e]); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i]; for(long long i=1;i<=p;i++) d[i]=(i==1?0:maxn); memset(down,0,sizeof(down));}long long Ndijkstra(){ while(!que.empty()) que.pop(); que.push(1); down[1]=1; while(!que.empty()) { long long x=que.front(); que.pop(); down[x]=0; for(long long e=Nfirst[x];e!=-1;e=Nnext[e]) { if(d[u[e]]>d[x]+w[e]) { d[u[e]]=d[x]+w[e]; if(down[u[e]]==0) que.push(u[e]); } } } for(long long i=1;i<=p;i++) if(d[i]!=maxn) sum+=d[i];}int main(){ long long T; scanf("%I64d",&T); while(T--) { sum=0; scanf("%I64d%I64d",&p,&q); init(); for(long long i=1;i<=q;i++) { scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]); next[i]=first[u[i]]; first[u[i]]=i; Nnext[i]=Nfirst[v[i]]; Nfirst[v[i]]=i; } dijkstra(); Ndijkstra(); printf("%I64d\n",sum); } return 0;}
- poj 1511
- POJ 1511
- poj 1511
- POJ 1511
- POJ 1511
- POJ 1511
- poj 1511
- POJ 1511
- poj---1511
- POJ 1511
- poj 1511
- POJ 1511
- poj 1511
- POJ 1511 Invitation Cards
- poj 1511 Invitation Cards
- poj 1511 Invitation Cards
- POJ 1511 Invitation Cards
- poj 1511 spfa
- C#中DataTable的一些常用操作
- .NET C# 发送邮件内容嵌入图片
- 软件BUG解决方法
- struts session 2(实现struts的借口)
- 添加新的菜单到jira导航栏
- poj 1511
- 七夕,情无处投递
- Android实现数据存储技术
- Objective-C中单例模式的实现
- SAP 开发中常用到的BAPI
- Unable to resolve target 'android-7'
- win下开机不登陆系统自动运行程序
- QQ 多级列表的实现
- 凸多边形最优三角剖分——动态规划