最小生成树。
prim算法。
要问while(scanf("%d", &n)) 和 while(~scanf("%d", &n))、while(scanf("%d", &n)==1)、while(~scanf("%d", &n)!=EOF) 的区别有多大??
答 :前者TLE ,后者 15MS。。。。 不信可以试试。。
以后再也不敢简写了。。。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 int map[102][102]; 8 9 int prim(int n) 10 { 11 int i, j; 12 int pos; 13 int vis[102]; 14 int d[102]; 15 int sum, min; 16 sum=0; 17 memset(vis, 0, sizeof(vis)); 18 for (i=1; i<=n; i++) 19 d[i]=map[1][i]; 20 vis[1]=1; 21 for (i=1; i<n; i++) 22 { 23 min=100000; 24 for (j=1; j<=n; j++) 25 { 26 if (vis[j] == 0 && min > d[j]) 27 { 28 min=d[j]; 29 pos=j; 30 } 31 } 32 vis[pos]=1; 33 sum+=min; 34 for (j=2; j<=n; j++) 35 { 36 if (vis[j] == 0 && d[j] > map[pos][j]) 37 { 38 d[j]=map[pos][j]; 39 } 40 } 41 } 42 return sum; 43 } 44 45 int main() 46 { 47 int n, m, i, j, a, b; 48 while(~scanf("%d", &n)) 49 { 50 for (i=1; i<=n; i++) 51 for (j=1; j<=n; j++) 52 scanf("%d", &map[i][j]); 53 scanf("%d", &m); 54 for (i=1; i<=m; i++) 55 { 56 scanf("%d%d", &a, &b); 57 map[a][b]=map[b][a]=0; 58 } for (i=1; i<=n; i++) 59 map[i][i]=0; 60 printf("%d\n", prim(n)); 61 } 62 return 0; 63 }