首页 > 代码库 > SDUT 2929-人活着系列之芳姐和芳姐的猪(最短路Floyd)

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

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

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 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;
}