1.dijkstra算法实现
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> int edge[21][21]; int visit[21]; int dis[21]; #define INF 0x3f3f3f3f int dijkstra(int s,int e){ int i,j,k; memset(visit,0,sizeof(visit)); for(i=1;i<=20;i++){ //路径 dis[i]=INF; } dis[s]=0; int miniPos; for(j=1;j<=20;j++) { int min=INF; for(i=1;i<=20;i++){ if(!visit[i]&&dis[i]<min){ miniPos=i; min=dis[i]; } } visit[miniPos]=1; //从此处为起点 for(i=1;i<=20;i++){ if(!visit[i]&&dis[i]>dis[miniPos]+edge[miniPos][i]){ dis[i]=dis[miniPos]+edge[miniPos][i]; } } } return dis[e]; } int main(){ int n,m,x; int i,j; int T=1; while(scanf("%d",&n)!=EOF){ for(i=1;i<=20;i++){ for(j=1;j<=20;j++){ edge[i][j]=INF; } } for(j=1;j<=n;j++){ scanf("%d",&x); edge[1][x]=edge[x][1]=1; } for(i=2;i<=19;i++){ scanf("%d",&n); for(j=1;j<=n;j++){ scanf("%d",&x); edge[i][x]=edge[x][i]=1; } } if(scanf("%d",&m)){ int start,end; printf("Test Set #%d\n",T++); for(i=0;i<m;i++){ scanf("%d%d",&start,&end); int disss=dijkstra(start,end); printf("%d to %d: %d\n",start,end,disss); } printf("\n"); } } return 0; }
2、Floyd算法实现:
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f #define LOCAL int edge[21][21]; int path[21][21]; void init(){ int i,j; for(i=1;i<=20;i++){ for(j=1;j<=20;j++){ edge[i][j]=INF; } } } int floyd(int s,int e){ int i,j,k; for(i=1;i<=20;i++){ for(j=1;j<=20;j++){ for(k=1;k<=20;k++){ if(edge[j][k]>edge[j][i]+edge[i][k]){ edge[j][k]=edge[j][i]+edge[i][k]; path[j][k]=i; } } } } return edge[s][e]; } void output(int i,int j){ if(path[i][j]==0){ printf("%d ",j); }else{ output(i,path[i][j]); output(path[i][j],j); } } int main(){ #ifdef LOCAL freopen("test.txt", "r", stdin); //freopen("out.txt", "w", stdout); #endif int i,j,n,x,m,t; int TT=1; while(scanf("%d",&n)!=EOF){ for(i=1;i<=20;i++){ for(j=1;j<=20;j++){ edge[i][j]=INF; } } for(i=1;i<=n;i++){ scanf("%d",&t); edge[1][t]=edge[t][1]=1; } for(i=2;i<=19;i++){ scanf("%d",&x); for(j=1;j<=x;j++){ scanf("%d",&t); edge[i][t]=edge[t][i]=1; } } if(scanf("%d",&m)){ int s,e; printf("Test Set #%d\n",TT++); for(i=0;i<m;i++){ scanf("%d%d",&s,&e); int ss=floyd(s,e); printf("\n%d to %d: %d\n",s,e,ss); //printf("%d ",s); //output(s,e); } printf("\n"); } } return 0; }