http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2929
人活着系列之芳姐和芳姐的猪
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
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- int main()
- {
- int n, m, k;
- while(~scanf("%d %d %d", &n, &m, &k))
- {
- int a[1200+5][1200+5], b[1000+5];
- for(int i=0;i<=m;i++)
- for(int j=0;j<=m;j++)
- if(i==j) a[i][j]=0;
- else a[i][j]=0x3f3f3f3f;
- for(int i=1;i<=n;i++)
- scanf("%d", &b[i]);
- for(int i=1;i<=k;i++)
- {
- int u, v, w;
- scanf("%d %d %d", &u, &v, &w);
- if(a[u][v]>w)
- a[u][v]=a[v][u]=w;
- }
- for(int k=1;k<=m;k++)
- for(int i=1;i<=m;i++)
- for(int j=1;j<=m;j++)
- if(a[i][j]>a[i][k]+a[k][j])
- a[i][j]=a[i][k]+a[k][j];
- // for(int i=1;i<=m;i++)
- // {
- // for(int j=1;j<m;j++)
- // printf("%d ", a[i][j]);
- // printf("%d\n", a[i][m]);
- // }
- int min=0x3f3f3f3f;
- for(int i=1;i<=m;i++) //1到m为猪圈编号
- {
- int sum=0;
- for(int j=1;j<=n;j++)
- sum+=a[i][b[j]];
- if(sum<min) min=sum; //sum记录在第i个猪圈投食的话所有的猪走的路程和
- }
- printf("%d\n", min); //输出最小值
- }
- return 0;
- }