ACM3371超时问题

这的确也是个大坑;

其实在这是到很简单的最小生成树的题目,但是数据量却很大;

用G++提交会超时,用C++不会超时,而且速度超快;

又长见识了。可惜长得不是做题的能力,而是知道它到底有多坑。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=600;
 5 const int oo=11111111;
 6 int map[N][N];
 7 int vis[N];
 8 int n,m,k;
 9 int low[N];
10 int prim(int s)
11 {
12     memset(vis,0,sizeof(vis));
13     for(int i=1;i<=n;i++)
14     low[i]=map[s][i];
15     low[s]=0;
16     vis[s]=1;
17     int sum=0,v;
18     for(int i=1;i<n;i++)
19     {
20         int Min=oo;
21         for(int j=1;j<=n;j++)
22             if(!vis[j]&&low[j]<Min)
23             {
24             Min=low[j];v=j;
25             }
26         if(Min==oo)return -1;
27         sum+=Min;
28         vis[v]=1;
29         for(int j=1;j<=n;j++)
30         {
31             if(!vis[j]&&low[j]>map[j][v])
32             low[j]=map[j][v];
33         }
34     }
35     return sum;
36 }
37 int main()
38 {
39     int t;
40     scanf("%d",&t);
41     while(t--)
42     {
43         scanf("%d %d %d",&n,&m,&k);
44         for(int i=1;i<=n;i++)
45         for(int j=1;j<=n;j++)
46         {
47             map[i][j]=oo;
48         }
49         int a,b,c;
50         for(int i=1;i<=m;i++)
51         {
52             scanf("%d %d %d",&a,&b,&c);
53             if(map[a][b]>c)map[a][b]=map[b][a]=c;
54         }
55         int ct,room[N];
56         for(int i=1;i<=k;i++)
57         {
58             scanf("%d",&ct);
59             for(int j=1;j<=ct;j++)
60             {
61                 scanf("%d",&room[j]);
62             }
63             for(int j=1;j<=ct;j++)
64             for(int s=j+1;s<=ct;s++)
65             {
66                 map[room[s]][room[j]]=map[room[j]][room[s]]=0;
67             }
68         }
69         int result=prim(1);
70         printf("%d\n",result);
71     }
72     return 0;
73 }

转载于:https://www.cnblogs.com/sytu/p/3854461.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值