人活着系列之芳姐和芳姐的猪
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
芳姐特别喜欢猪,所以,她特意养了m个猪圈,顺便在k条无向边,每条边有都有起点v,距离.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少?
输入
第一行,猪的个数m(k(1<=k<=1200).(猪的编号为1..m)
N+1行N头猪所在的猪圈号第n+k+1行:u、1<=w<=255)
m个猪圈连通。
输出
示例输入
3 4 5 2 3 4 1 2 1 1 3 5 2 3 7 2 4 3 3 4 5
示例输出
8
多源最短路,不知道为什么用Dijkstra+优先队列死活过不去,用Floyd到没什么坑点,不过毕竟是第一发Floyd。。纪念一下
(话说这是分批赛的题,一个暑假都快走完了我才会做。。。)
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cctype> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> #include <list> #define L long long using namespace std; const int INF=1<<20; const int maxn=5010; int dis[maxn][maxn]; int n,m,k; void Floyd() { for(int k=1;k<=m;k++) for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } int main() { int s[maxn],i,j,u,v,w; scanf("%d%d%d",&n,&m,&k); for(i=0;i<n;i++) scanf("%d",&s[i]); for(i=1;i<=m;i++) for(j=1;j<=m;j++) if(j!=i) dis[i][j]=dis[j][i]=INF; else dis[i][j]=0; while(k--) { scanf("%d%d%d",&u,&v,&w); if(dis[u][v]>w) { dis[u][v]=w; dis[v][u]=w; } } int Min=INF; Floyd(); for(i=1;i<=m;i++) { int sum=0; for(j=0;j<n;j++) { sum+=dis[i][s[j]]; } if(Min>sum) Min=sum; } printf("%d\n",Min); return 0; }
SDUT 2929-人活着系列之芳姐和芳姐的猪(最短路Floyd)
时间: 2024-10-09 10:09:32