题意:最短路径
思路:最短路径模板
1.单源最短路径(dijkstra)
#include<iostream> #include<stdio.h> using namespace std; #define MAXN 1010 #define typec int #define INF 0x3f3f3f3f//防止后面溢出,这个不能太大 bool vis[MAXN]; int pre[MAXN]; int cost[MAXN][MAXN],lowcost[MAXN]; void dijkstra(typec cost[][MAXN],typec lowcost[],int n,int beg){//beg为源点 int i,j,k,Min; for(i=0;i<n;++i){ lowcost[i]=INF;vis[i]=false;pre[i]=-1; } lowcost[beg]=0; for(j=0;j<n;++j){ k=-1; Min=INF; for(i=0;i<n;++i) if(!vis[i]&&lowcost[i]<Min){ Min=lowcost[i]; k=i; } if(k==-1)break; vis[k]=true; for(i=0;i<n;++i) if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){ lowcost[i]=lowcost[k]+cost[k][i]; pre[i]=k; } } } int main(){ int n,m;//点数,边数 int a,b,w,i,j; int s,t;//起点,终点 while(~scanf("%d%d",&n,&m)){ for(i=0;i<n;++i) for(j=0;j<n;++j) cost[i][j]=INF; for(i=0;i<m;++i){ scanf("%d%d%d",&a,&b,&w); if(w<cost[a][b])cost[a][b]=cost[b][a]=w;// } scanf("%d%d",&s,&t); dijkstra(cost,lowcost,n,s); if(lowcost[t]!=INF)printf("%d\n",lowcost[t]); else printf("-1\n"); } return 0; }
2.多源最短路径(floyd)
#include<iostream> #include<stdio.h> using namespace std; #define MAXN 1010 #define typec int #define INF 0x3f3f3f3f//防止后面溢出,这个不能太大 int path[MAXN][MAXN]; int cost[MAXN][MAXN],lowcost[MAXN][MAXN]; void floyd(typec cost[][MAXN],typec lowcost[][MAXN],int n){ int i,j,k; for(i=0;i<n;++i) for(j=0;j<n;++j){ lowcost[i][j]=cost[i][j]; if(i!=j&&cost[i][j]<INF)path[i][j]=i; else path[i][j]=-1; } for(k=0;k<n;++k) for(i=0;i<n;++i) for(j=0;j<n;++j) if(lowcost[i][k]+lowcost[k][j]<lowcost[i][j]){ lowcost[i][j]=lowcost[i][k]+lowcost[k][j]; path[i][j]=path[k][j]; } } int main(){ int n,m;//点数,边数 int a,b,w,i,j; int s,t;//起点,终点 while(~scanf("%d%d",&n,&m)){ for(i=0;i<n;++i) for(j=0;j<n;++j) cost[i][j]=INF; for(i=0;i<m;++i){ scanf("%d%d%d",&a,&b,&w); if(w<cost[a][b])cost[a][b]=cost[b][a]=w;// } scanf("%d%d",&s,&t); floyd(cost,lowcost,n); if(s==t)printf("0\n"); else if(lowcost[s][t]!=INF)printf("%d\n",lowcost[s][t]); else printf("-1\n"); } return 0; }
时间: 2024-10-14 03:58:21