poj2387 Til the Cows Come Home(邻接矩阵,邻接表 )
来源:互联网 发布:网络流行文化的研究 编辑:程序博客网 时间:2024/06/05 21:53
dijkstra的模板题,除去有重复边这个坑点。
对于图的存储,我使用两种方式,邻接矩阵和邻接表,而邻接表的实现又有多种方式。
之前用数组模拟,好久不写,也忘了..懒得捡起来,用新方法 vector还真是方便。
#include<cstdio>#include<cstring>#define inf 1<<29using namespace std;int M[1050][1050],T,N,dist[1050];bool visit[1050];void dijkstra() { memset(visit,false,sizeof(visit)); for(int i=1;i<=N;i++) dist[i]=M[1][i]; visit[1]=true; for(int i=2;i<=N;i++) { int Min=inf,index; for(int j=1;j<=N;j++) { if(visit[j]==false&&dist[j]<Min) { index=j; Min=dist[j]; } } visit[index]=true; for(int j=1;j<=N;j++) { if(visit[j]==false&&dist[j]>dist[index]+M[index][j]) dist[j]=dist[index]+M[index][j]; } }}int main(){ while(~scanf("%d %d",&T,&N)) { for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) if(i==j) M[i][j]=0; else M[i][j]=inf; for(int i=1;i<=T;i++) { int a,b,c; scanf("%d %d %d",&a,&b,&c); if(M[a][b]>c) M[a][b]=M[b][a]=c; } dijkstra(); printf("%d\n",dist[N]); }}
邻接表,数组模拟,优点:没有任何多余空间,缺点:规则半年不用忘了…
Memory: 476 KB Time: 32 MS
#include<cstdio>#include<cstring>#include<algorithm>#define inf 1<<29using namespace std;const int maxn=4050;int u[maxn],v[maxn],w[maxn],first[maxn],next[maxn],T,N,dist[maxn];bool visit[maxn];void dijkstra(){ memset(visit,false,sizeof(visit)); for(int i=1;i<=N;i++) dist[i]=inf; dist[1]=0; visit[1]=true; int Min,index=1; for(int i=2;i<=N;i++) { for(int j=first[index];j!=-1;j=next[j]) { if(visit[v[j]]==false&&dist[index]+w[j]<dist[v[j]]) dist[v[j]]=dist[index]+w[j]; } Min=inf; for(int j=1;j<=N;j++) { if(visit[j]==false&&dist[j]<Min) { index=j; Min=dist[j]; } } visit[index]=true; }}int main(){ while(~scanf("%d %d",&T,&N)) { memset(first,-1,sizeof(first)); memset(next,-1,sizeof(next)); for(int i=1;i<=T*2;i+=2) { int a,b,c; scanf("%d %d %d",&a,&b,&c); u[i]=v[i+1]=a,v[i]=u[i+1]=b,w[i]=w[i+1]=c;//无向边,双向存。 next[i]=first[u[i]],next[i+1]=first[u[i+1]]; first[u[i]]=i,first[u[i+1]]=i+1; } dijkstra(); printf("%d\n",dist[N]); }}
Vector 实现邻接表。优点:方便啊 !代码小,不易犯错误!
#include<cstdio>#include<cstring>#include<vector>#include<iostream>const int inf=1<<29;using namespace std;const int maxn=1010;typedef struct EdgeNode{ int to,w;}node;int v[maxn],dist[maxn],n,m;vector<node>M[maxn];void dijkstra(){ memset(v,0,sizeof(v)); v[1]=1; for(int i=1;i<=n;i++) dist[i]=inf; for(vector<node>::iterator it=M[1].begin();it!=M[1].end();it++){ node t=*it; dist[t.to]=min(t.w,dist[t.to]); } for(int i=2;i<=n;i++){ int minn=inf,index; for(int j=1;j<=n;j++){ if(!v[j]&&minn>dist[j]){ minn=dist[j]; index=j; } } v[index]=1; for(vector<node>::iterator it=M[index].begin();it!=M[index].end();it++){ node t=*it; if(!v[t.to]&&dist[t.to]>dist[index]+t.w) dist[t.to]=dist[index]+t.w; } }}int main(){ while(~scanf("%d%d",&m,&n)){ for(int i=0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); M[a].push_back(node{b,c}); M[b].push_back(node{a,c}); } dijkstra(); printf("%d\n",dist[n]); }}
1 0
- poj2387 Til the Cows Come Home(邻接矩阵,邻接表 )
- poj2387- Til the Cows Come Home
- poj2387- Til the Cows Come Home
- POJ2387 Til the Cows Come Home
- POJ2387 Til the Cows Come Home【Dijkstra】
- POJ2387----Til the Cows Come Home(dijkstra)
- POJ2387---Til the Cows Come Home
- POJ2387 Til the Cows Come Home
- [poj2387] Til the Cows Come Home
- poj2387 Til the Cows Come Home
- poj2387 Til the Cows Come Home
- poj2387 Til the Cows Come Home
- POJ2387 Til the Cows Come Home
- POJ2387 Til the Cows Come Home
- Poj2387- Til the Cows Come Home
- POJ2387 Til the Cows Come Home
- POJ2387 Til the Cows Come Home
- POJ2387-Til the Cows Come Home
- beetl模板入门例子
- 剑指offer刷题之c++实现的求链表中倒数第k个值
- IPC(进程间通信)机制
- Thread02:线程同步通信
- 小根堆+Kruskal算法
- poj2387 Til the Cows Come Home(邻接矩阵,邻接表 )
- Unity3D中uGUI事件系统简述及使用方法总结
- 安卓开发中防止内存溢出浅析
- 单链表、链表队列、循环队列、栈
- Spring3 MVC 深入研究
- hadoop2.5 测试环境安装
- 中缀表达式转后缀表达式
- 对冲基金
- 数据库设计三大范式