http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2929

这个题一方面数据水,另一方面就是思维水,一拿到题就以为考最小生成树。

因为这个题需要求各点间的距离,又因为猪圈的数目最大为600,所以根本就没寻思考Floyd,一方面思维,另一方面是水的后台,因为猪每天去固定的猪圈吃饭,所以求出每个猪到每个猪圈固定的距离便可。

WA(以为已经求出各点间的最短距离,只要猪圈没猪便不会去)

反例

3 4 3

2

3

4

1 2 1

1 3 1

1 4 1

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define N 1000001
using namespace std;
int map[602][602],dis[602],v[602];
int n,m,k,a[401],V;
void Floy()
{
    for(int k=1; k<=m; k++)
    {
        for(int j=1; j<=m; j++)
        {
            for(int i=1; i<=m; i++)
            {
                if(map[j][i]>map[j][k]+map[k][i])
                {
                    map[j][i]=map[j][k]+map[k][i];
                }
            }
        }
    }
}
void prim()
{
    memset(v,0,sizeof(v));
    for(int i=1; i<=m; i++)
        dis[i]=map[a[1]][i];
    v[a[1]]=1;
    int min,k;
    int sum=0;
    for(int i=1; i<V; i++)
    {
        min=N;
        for(int j=1; j<=m; j++)
        {
            if(v[j]==0&&dis[j]<min)
            {
                min=dis[j];
                k=j;
            }
        }
        v[k]=1;
        //printf("min==%d\n",min);
        sum=sum+min;
        for(int j=1; j<=m; j++)
        {
            if(v[j]==0&&dis[j]>map[k][j])
            {
                dis[j]=map[k][j];
            }
        }
    }
    printf("%d\n",sum);
}
int main()
{
    int xx[1211],yy[1211],zz[1211];
    int sum,sum1;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1; i<=m; i++)
    {
        for(int j=1; j<=m; j++)
        {
            map[i][j]=N;
            map[j][i]=N;
        }
        map[i][i]=0;
    }
    int b[1211];
    V=0;
    memset(b,0,sizeof(b));
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
        b[a[i]]++;
    }
    for(int i=1; i<=m; i++)
    {
        if(b[a[i]])
            V++;
    }
    for(int i=1; i<=k; i++)
    {
        scanf("%d%d%d",&xx[i],&yy[i],&zz[i]);
        if(zz[i]<map[xx[i]][yy[i]])
        {
            map[xx[i]][yy[i]]=zz[i];
            map[yy[i]][xx[i]]=zz[i];
        }
    }
    Floy();
    /*for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=m;j++)
        {
            printf("%d ",map[i][j]);
        }
        printf("\n");
    }*/
    for(int i=1; i<=k; i++)
    {
        sum=0;
        sum1=0;
        for(int j=1; j<=n; j++)
        {
            if(xx[i]==a[j]) sum++;
            if(yy[i]==a[j]) sum1++;
        }
        if(sum==0)
        {
            for(int k=1; k<=m; k++)
            {
                map[xx[i]][k]=N;
                map[k][xx[i]]=N;
            }
            map[xx[i]][xx[i]]=0;
        }
        if(sum1==0)
        {
            for(int k=1; k<=m; k++)
            {
                map[yy[i]][k]=N;
                map[k][yy[i]]=N;
            }
            map[yy[i]][yy[i]]=0;
        }
        if(sum&&sum1)
        {
            map[xx[i]][yy[i]]=sum*map[xx[i]][yy[i]];
            map[yy[i]][xx[i]]=sum1*map[yy[i]][xx[i]];
        }
    }
    prim();
}
return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.

AC的

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define N 1000001
using namespace std;
int n,m,k;
int a[351],map[601][601];
void Floy()
{
    for(int k=1; k<=m; k++)
    {
        for(int i=1; i<=m; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(map[i][j]>map[i][k]+map[k][j])
                {
                    map[i][j]=map[i][k]+map[k][j];
                }
            }
        }
    }
}
int main()
{
    int xx,yy,zz;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    for(int i=1; i<=m; i++)
    {
        for(int j=1; j<=m; j++)
        {
            map[i][j]=N;
            map[j][i]=N;
        }
        map[i][i]=0;
    }
    while(k--)
    {
        scanf("%d%d%d",&xx,&yy,&zz);
        if(map[xx][yy]>zz)
        {
            map[xx][yy]=zz;
            map[yy][xx]=zz;
        }
    }
    Floy();
    int min=N;
    int sum;
    for(int i=1; i<=m; i++)
    {
        sum=0;
        for(int j=1; j<=n; j++)
        {
            sum=sum+map[a[j]][i];
        }
        if(min>sum)
            min=sum;
    }
    printf("%d\n",min);
return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.