洛谷P1194 买礼物
在买了第一次之后,你还要买 n-1次,把所有点都连起来,这样做一个最小生成树
就行了,然后要注意题目中说了如果a[ i ][ j ]==0 则表示两个点是不相连的,赋值 inf
最后还要注意一下一开连第一条边是需要A的
1 #include <bits/stdc++.h> 2 #define LL long long 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using namespace std ; 5 6 const int N = 511,inf = 1e9 ; 7 int A,n,sum ; 8 int dist[N],a[N][N] ; 9 bool visit[N] ; 10 11 inline LL read() 12 { 13 LL x = 0 , f = 1 ; 14 char ch = getchar() ; 15 while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) f = -1 ; ch = getchar() ; } 16 while(ch>=‘0‘&&ch<=‘9‘) { x = x * 10+ch-48 ; ch = getchar() ; } 17 return x * f ; 18 } 19 20 inline void prim() 21 { 22 For(i,1,n) visit[ i ] = 0 , dist[ i ] = inf ; 23 dist[ 1 ] = 0 ; dist[ 0 ] = inf ; 24 int k ; 25 For(i,1,n) { 26 k = 0 ; 27 For(j,1,n) 28 if(!visit[j]&&dist[j] < dist[ k ] ) k = j ; 29 visit[ k ] = 1 ; 30 For(j,1,n) 31 if(!visit[j]&&a[k][j] < dist[ j ]) dist[ j ] = a[ k ][ j ] ; 32 } 33 For(i,1,n) sum+=dist[ i ] ; 34 sum+=A ; 35 printf("%d\n",sum) ; 36 } 37 38 int main() 39 { 40 A = read() ; n = read() ; 41 For(i,1,n) 42 For(j,1,n) { 43 a[ i ][ j ] = read() ; 44 if(a[ i ][ j ] == 0) a[ i ][ j ] = inf ; 45 } 46 prim() ; 47 return 0 ; 48 }
时间: 2024-10-13 18:19:12