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

来源:互联网 发布:知美画室怎么样 编辑:程序博客网 时间:2024/04/29 00:49

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

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

题目描述

百年来,人活着是为了什么这个问题一直萦绕在人的脑海里,也一直困扰着人的思想。人活着就是活着了,为活着本身而活着,而不是为活着之外的任何事物而活着的。正因为活着,所以活着。对,是有点莫明其妙,但也是一句最受用的话。

芳姐特别喜欢猪,所以,她特意养了n头猪,建了m个猪圈,顺便在m个猪圈间修了k条无向边,每条边有都有起点u,终点v,距离w。每头猪呆在一个特定的猪圈,有一个问题一直困扰着芳姐,那就是喂猪.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少?

输入

 第一行: 三个数,猪的个数n(1<=n<=350),猪圈个数m2<=m<=600),猪圈间道路数k(1<=k<=1200).(猪的编号为1..N,猪圈的编号为1..m)

第二行到第N+1: 1N头猪所在的猪圈号.

n+2行到第n+k+1行:每行有三个数:相连的猪圈uv,两猪圈间距离(1<=w<=255)

注:有的猪圈可能是空的,也可能有多头猪,保证m个猪圈连通。

输出

 

示例输入

3 4 52341 2 11 3 52 3 72 4 33 4 5

示例输出

8


Dijkstra + 优先队列

#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing 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 0x3f3f3f3fusing 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;} 



0 0
原创粉丝点击