zrq495
www.zrq495.com

最小生成树。

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 }
posted on 2012-08-06 21:23  zrq495  阅读(171)  评论(0编辑  收藏  举报