人活着系列之芳姐和芳姐的猪
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
百年来,人活着是为了什么这个问题一直萦绕在人的脑海里,也一直困扰着人的思想。人活着就是活着了,为活着本身而活着,而不是为活着之外的任何事物而活着的。正因为活着,所以活着。对,是有点莫明其妙,但也是一句最受用的话。
芳姐特别喜欢猪,所以,她特意养了n头猪,建了m个猪圈,顺便在m个猪圈间修了k条无向边,每条边有都有起点u,终点v,距离w。每头猪呆在一个特定的猪圈,有一个问题一直困扰着芳姐,那就是喂猪.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少?
输入
第一行
: 三个数
,猪的个数
n(1<=n<=350),猪圈个数
m(
2<=m<=600),猪圈间道路数
k(1<=k<=1200).(猪的编号为
1..N, 猪圈的编号为
1..m)
第二行到第N+1行: 1到N头猪所在的猪圈号.
第n+2行到第n+k+1行: 每行有三个数:相连的猪圈u、v,两猪圈间距离(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 + 优先队列
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
struct node
{
int v,w,next;
} ls[360001];
int Pigsty[601];
int head[601];
int zd[610][610];
bool vis[610];
int num;
void Add(int x,int y,int z)
{
ls[num].v = y;
ls[num].w = z;
ls[num].next = head[x];
head[x] = num++;
}
void Dijkstra(int s,int m)
{
int t;
queue<int >q;
memset(vis,false,sizeof(vis));
for(int i=0; i<=m; i++)
{
zd[s][i] = INF;
}
zd[s][s] = 0;
vis[s] = true;
q.push(s);
while(!q.empty())
{
t = q.front();
q.pop();
int x = t;
for(int i=head[x]; ~i; i = ls[i].next)
{
int y = ls[i].v;
if(zd[s][y] > zd[s][x] + ls[i].w)
{
zd[s][y] = zd[s][x] + ls[i].w;
if(!vis[y])
{
vis[y] = true;
q.push(y);
}
}
}
vis[x] = false;
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m,k;
while(cin>>n>>m>>k)
{
int nn = INF;
num = 0;
memset(Pigsty,0,sizeof(Pigsty));
memset(head,-1,sizeof(head));
int Pig;
for(int i=0; i<n; i++)
{
cin>>Pig;
Pigsty[Pig]++;
}
for(int i=0; i<k; i++)
{
int x,y,z;
cin>>x>>y>>z;
Add(x,y,z);
Add(y,x,z);
}
for(int i=1; i<=m; i++)
{
Dijkstra(i,m);
}
int sum;
for(int i=1; i<=m; i++)
{
sum = 0;
for(int j=1; j<=m; j++)
{
if(Pigsty[j])
{
sum += Pigsty[j] * zd[i][j];
}
}
if(sum < nn)
nn = sum;
}
printf("%d\n",nn);
}
return 0;
}
Floyd算法
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int dis[610][610];
void Floyd(int m)
{
for(int k=1;k<=m;k++)
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
dis[i][j] = dis[i][j] < dis[i][k]+dis[k][j] ? dis[i][j] : dis[i][k] + dis[k][j];
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int s[610];
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
cin>>s[i];
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(i!=j)
dis[i][j] = INF;
else
dis[i][j] = 0;
}
}
for(int i=0;i<k;i++)
{
int u,v,w;
cin>>u>>v>>w;
if(dis[u][v] > w)
{
dis[u][v] = w;
dis[v][u] = w;
}
}
int MIN = INF;
Floyd(m);
for(int i=1;i<=m;i++)
{
int sum = 0;
for(int j=0;j<n;j++)
{
sum += dis[i][s[j]];
}
if(sum < MIN)
MIN = sum;
}
cout<<MIN<<endl;
return 0;
}