3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
2 -1
此题应该是这个专题里面最简单的题了,题意简单明了,让我们求最短路径,道路也是双向的,数据也很弱,直接用简单粗暴的Floyd算法吧。
#include <cstdio> #include <cstring> #define INF 0xfffffff #define maxn 200+5 int map[maxn][maxn],n; void Floyd() { for(int k=0; k<n; k++) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(map[i][j] > map[i][k]+map[k][j]) map[i][j] = map[i][k]+map[k][j]; } } } } int main() { int m,a,b,cost; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(i == j) map[i][j] = 0; else map[i][j] = INF; } } for(int i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&cost); if(map[a][b] > cost) map[a][b] = map[b][a] = cost; } Floyd(); scanf("%d%d",&a,&b); if(map[a][b] == INF) printf("-1\n"); else printf("%d\n",map[a][b]); } return 0; }
当然,SPFA也是必须得会用的
#include <cstdio>//Floyd #include <cstring> #define INF 0xfffffff #define maxn 200+5 int map[maxn][maxn],n; void Floyd() { for(int k=0; k<n; k++) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(map[i][j] > map[i][k]+map[k][j]) map[i][j] = map[i][k]+map[k][j]; } } } } int main() { int m,a,b,cost; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(i == j) map[i][j] = 0; else map[i][j] = INF; } } for(int i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&cost); if(map[a][b] > cost) map[a][b] = map[b][a] = cost; } Floyd(); scanf("%d%d",&a,&b); if(map[a][b] == INF) printf("-1\n"); else printf("%d\n",map[a][b]); } return 0; } #include <stdio.h>//SPFA #include <iostream> #include <queue> using namespace std; #define N 205 #define INF 0x3f3f3f3f int n,m,map[N][N]; int visited[N],dis[N]; int SPFA(int src,int des) { int i; for(i=0;i<n;i++) { dis[i]=INF; visited[i]=0; } queue<int> q; dis[src]=0; visited[src]=1; q.push(src); int tmp; while(!q.empty()) { tmp=q.front(); q.pop(); visited[tmp]=0; for(i=0;i<n;i++) if(dis[i]>dis[tmp]+map[tmp][i]) { dis[i]=dis[tmp]+map[tmp][i]; if(!visited[i]) { visited[i]=1; q.push(i); } } } return dis[des]; } int main() { int u,v,cost; while(scanf("%d%d",&n,&m)!=EOF) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j]=INF; for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&cost); if(cost<map[u][v]) map[u][v]=map[v][u]=cost; } int s,t; scanf("%d%d",&s,&t); int ans=SPFA(s,t); if(ans<INF) printf("%d\n",ans); else printf("-1\n"); } return 0; }