SDUT 2929-人活着系列之芳姐和芳姐的猪(最短路Floyd)

来源:互联网 发布:第一版主小说网新域名 编辑:程序博客网 时间:2024/05/01 23:49

人活着系列之芳姐和芳姐的猪

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

芳姐特别喜欢猪,所以,她特意养了m个猪圈,顺便在k条无向边,每条边有都有起点v,距离.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少?

输入

 第一行,猪的个数mk(1<=k<=1200).(猪的编号为1..m)

N+1N头猪所在的猪圈号n+k+1行:u1<=w<=255)

m个猪圈连通。

输出

 

示例输入

3 4 52341 2 11 3 52 3 72 4 33 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 longusing 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;elsedis[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;}


3 0