HDU 3664 最短路
纯最短路 借这个题整理一下三种最短路方法
dijkstra代码:
#include<iostream> #include<cstdio> #define inf 999999; using namespace std; int dist[12],map[12][12],sea[12]; int N; void dijkstra(int x) { int i,j,min,mark; for(i=1;i<N;i++) { dist[i]=inf; dist[i]=map[x][i]; } for(i=1;i<N;i++)//控制次数,怎么感觉跟prim一样呢 { min=inf; for(j=0;j<N;j++) if(dist[j]&&min>dist[j]) { min=dist[j]; mark=j; } dist[mark]=0; for(j=0;j<N;j++) { if(dist[j]>map[mark][j]) dist[j]=map[mark][j]; if(map[x][j]>map[x][mark]+map[mark][j]) map[x][j]=map[x][mark]+map[mark][j]; } } } int main() { int i,n,j,k; while(~scanf("%d",&N)) { for(k=0;k<N;k++) for(j=0;j<N;j++) { if(k==j) map[k][j]=0; else map[k][j]=inf; } for(i=0;i<N;i++) { scanf("%d%d",&n,&sea[i]); for(j=1;j<=n;j++) { scanf("%d",&k); scanf("%d",&map[i][k]); } } dijkstra(0); int MIN=inf; for(i=1;i<N;i++) if(sea[i]&&MIN>map[0][i]) MIN=map[0][i]; printf("%d\n",MIN); } return 0; }
floydd代码:
#include<iostream> #include<cstdio> #define inf 999999; using namespace std; int map[12][12],sea[12]; int N; void floyd(int x) { int i,j,k; for(i=0;i<N;i++) for(j=0;j<N;j++) for(k=0;k<N;k++) { if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } return ; } int main() { int i,n,j,k; while(~scanf("%d",&N)) { for(k=0;k<N;k++) for(j=0;j<N;j++) { if(k==j) map[k][j]=0; else map[k][j]=inf; } for(i=0;i<N;i++) { scanf("%d%d",&n,&sea[i]); for(j=1;j<=n;j++) { scanf("%d",&k); scanf("%d",&map[i][k]); } } floyd(0); int MIN=inf; for(i=1;i<N;i++) if(sea[i]&&MIN>map[0][i]) MIN=map[0][i]; printf("%d\n",MIN); } return 0; }
spfa代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> #define inf 1<<30 #include<queue> using namespace std; int dist[12],visit[12],sea[12],head[12]; int N,sum_edge; struct Edge { int u,v,w,next; }edge[1008]; void addedge(int x,int y,int W) { sum_edge++; edge[sum_edge].u=x; edge[sum_edge].v=y; edge[sum_edge].w=W; edge[sum_edge].next=head[x]; head[x]=sum_edge; } void spfa(int x) { int i,j,k; queue<int>qu; memset(dist,127,sizeof(dist)); memset(visit,0,sizeof(visit)); dist[x]=0; visit[x]=1; qu.push(x); while(!qu.empty()) { int star,e; star=qu.front(); qu.pop(); e=head[star]; while(e) { int vv=edge[e].v; if(dist[vv]>dist[star]+edge[e].w) { dist[vv]=dist[star]+edge[e].w; if(!visit[vv]) { visit[vv]=1; qu.push(vv); } } e=edge[e].next; } visit[star]=0; } } int main() { int i,k,n; while(~scanf("%d",&N)) { sum_edge=0; memset(head,0,sizeof(head)); for(k=0;k<N;k++) { scanf("%d%d",&n,&sea[k]); while(n--) { int jj,len; scanf("%d%d",&jj,&len); addedge(k,jj,len); } } spfa(0); int MIN=inf,mark=0; for(i=1;i<N;i++) if(MIN>dist[i]&&sea[i]) { MIN=dist[i]; mark=i; } printf("%d\n",dist[mark]); } return 0; }