1 条题解

  • 0
    @ 2025-9-10 9:13:07

    C++ :

    #include<stdio.h>
    #include<string.h>
    #define INF 0xffffff
    #define Max 100
    
    void Floyd(int map[][Max], int n)
    {
    	int A[Max][Max];
    	int i, j, k;
    	for(i = 0; i < n; i++){
    		for(j = 0; j < n; j++){
    			A[i][j] = map[i][j];
    		}
    	}
    	for(k = 0; k < n; k++){
    		for(i = 0; i < n; i++)
    			for(j = 0; j < n; j++)
    				if(A[i][j] > A[i][k]+A[k][j])
    					A[i][j] = A[i][k]+A[k][j];
    	}
    	int min, min_max, yes = 0, x;
    	for(i = 0; i < n; i++){
    		min_max = 0;
    		for(j = 0; j < n; j++){
    			if(A[i][j] > min_max)
    				min_max = A[i][j];
    		}
    		if(min_max < INF)yes = 1;
    		else if(i) continue;
    		if(!i) { x = i; min = min_max; }
    		else if(min_max < min){
    			x = i; min = min_max;
    		}
    	}
    	if(yes) printf("%d %d\n", x+1, min);
    	else printf("disjoint\n");
    }
    
    int main()
    {
    	int n, map[Max][Max], m, x, v;
    	int i, j;
    	scanf("%d", &n);
    		for(i = 0; i < n; i++){
    			for(j = 0; j < n; j++)
    				if(i != j)map[i][j] = INF;
    				else map[i][j] = 0;
    		}
    		for(i = 0; i < n; i++){
    			scanf("%d", &m);
    			for(j = 0; j < m; j++){
    				scanf("%d%d", &x, &v);
    				map[i][x-1] = v;
    			}
    		}
    	Floyd(map, n);
    	return 0;
    }
    
    

    Pascal :

    var n,m,i,j,k,x,y,q,min,max:longint;
    a:array[0..101] of longint;
    f:array[0..101,0..101] of longint;
    p,d:boolean;
    
    
    begin
    readln(n);
    for i:=1 to n do
    begin
    read(m);
    for j:=1 to m do
    begin
      read(x,y);
      f[i,x]:=y;
    end;
    readln;
    end;
    for i:=1 to n do
    a[i]:=i;
    for i:=1 to n do
    for j:=1 to n do
    if i<>j then
    if (a[i]<>a[j]) and (f[i,j]>0) then
    begin
      q:=a[j];
      for k:=1 to n do
      if a[k]=q then a[k]:=a[i];
    end;
    q:=a[1];
    for i:=2 to n do
    if a[i]<>q then
    begin
      p:=true;
      break;
    end;
    if p then
    begin
      writeln('disjoint');
      halt;
    end;
    for i:=1 to n do
    for j:=1 to n do
    if f[i,j]=0 then f[i,j]:=1000000;
    for k:=1 to n do
    for i:=1 to n do
    for j:=1 to n do
    if (f[i,j]>f[i,k]+f[k,j]) and (f[i,k]+f[k,j]<>0) then
    f[i,j]:=f[i,k]+f[k,j];
    min:=maxlongint;
    for i:=1 to n do
    begin
      max:=-maxlongint;
      for j:=1 to n do
        if i<>j then
          if (f[i,j]>max) and (f[i,j]<>0) then max:=f[i,j];
      if max<min then
        begin
          min:=max;
          q:=i;
        end;
    end;
    writeln(q,' ',min);
    end.
    
    
    • 1

    信息

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