1 条题解

  • 0
    @ 2025-2-14 21:30:05

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<iomanip>
    #define MAX 1000000
    using namespace std;
    
    int n,x,y,tot=0,ans=0x7fffffff;
    int p[101];
    int g[101][101]={0};
    
    void in();
    void out();
    void flod();
    void find();
    
    int main()
    {
    	//freopen("3.in","r",stdin);
    	in();
    	flod();
    	find();
    	out();
    	return 0;
    }
    //
    void in()
    {
    	cin>>n;
    	n++;
    	for (int i=1;i<n;i++)
    	{
    		g[i][i]=0;
    		for (int j=1;j<n;j++)
    		{
    			if (i==j)
    			{
    				continue;
    			}
    			if (g[i][j])
    			{
    				continue;
    			}
    			g[i][j]=MAX;
    		}
    		cin>>p[i]>>x>>y;
    		if (x>0)
    		{
    			g[i][x]=g[x][i]=1;
    		}
    		if (y>0)
    		{
    			g[i][y]=g[y][i]=1;
    		}
    	}
    }
    //
    void flod()
    {
    	for (int i=1;i<n;i++)
    	{
    		for (int j=1;j<n;j++)
    		{
    			if (j==i)// || g[i][j]==MAX
    			{
    				continue;
    			}
    			for (int k=1;k<n;k++)
    			{
    				/*if (g[k][j]==MAX)
    				{
    					continue;
    				}*/
    				if ((k!=j) && (k!=i) && (g[i][j]+g[j][k]<g[i][k]))
    				{
    					g[i][k]=g[i][j]+g[j][k];
    				}
    			}
    		}
    	}
    }
    //
    void find()
    {
    	for (int i=1;i<n;i++)
    	{
    		tot=0;
    		for (int j=1;j<n;j++)
    		{
    			if (g[i][j]==MAX)
    			{
    				continue;
    			}
    			tot+=g[i][j]*p[j];
    		}
    		if (tot<ans)
    		{
    			ans=tot;
    		}
    	}
    }
    //
    void out()
    {
    	cout<<ans<<endl;
    }
    

    Pascal :

    program hospital;
    const maxn=101;
          max=1000000;
    var
         n,l1,l2,w,sum,min,i,j,k:longint;
         a,father:array[1..maxn] of longint;
         dis:array[1..maxn,1..maxn] of longint;
    procedure floyed;
    var h1,h2,h3:integer;
    begin
      readln(n);
      for i:=1 to n do
      for j:=1 to n do
      dis[i,j]:=max;
      for i:=1 to n do
      begin
      dis[i,i]:=0;
      readln(a[i],l1,l2);
      if l1>0 then begin dis[i,l1]:=1;dis[l1,i]:=1 end;
      if l2>0 then begin dis[i,l2]:=1;dis[l2,i]:=1 end;
      end;
      for h1:=1 to n do
      for h2:=1 to n do
      if h2<>h1 then
      for h3:=1 to n do
      if (h2<>h3) and (h1<>h3) and(dis[h2,h3]>dis[h2,h1]+dis[h1,h3]) then
      begin
         dis[h2,h3]:=dis[h2,h1]+dis[h1,h3];
         dis[h3,h2]:=dis[h2,h3];
      end;
    end;
    begin
      floyed;
      sum:=0;min:=maxlongint;
      for i:=1 to n do
      begin
        sum:=0;
        for j:=1 to n do
       inc(sum,a[j]*dis[i,j]);
        if sum<min then min:=sum;
      end;
    writeln(min);
    end.
    
    • 1

    信息

    ID
    939
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者