回 帖 发 新 帖 刷新版面

主题:一道经典最小生成树问题,我的代码一直是WA(C++),请大家帮忙看看。

3073.   Country Road
网址:http://acm.tju.edu.cn/toj/showp3073.html
大概题意:输入:每组测试数据都包含n,m,k;n:1到n为编号,m行为已经连接的。k行为连接的两点,及两点间距离。
          输出:把所以点都连上的最短路,不能都连上输出-1;

Sample Input
3
4 3 3
1 2
2 3
1 3
1 4 10
2 4 20
3 4 30
4 0 3
1 4 10
2 4 20
3 4 30
4 0 2
1 2 100
3 4 100

Sample Output
10
60
-1

以下是我的代码:

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;

int g[1010][1010];
int visit[1010];
int dis[1010];

int main()
{
    int t,n,m,k,i,j,a,b,c;
    cin>>t;
    while(t--)
    {
      memset(visit,0,sizeof(visit));
      memset(dis,999999,sizeof(dis));
      memset(g,999999,sizeof(g));
      scanf("%d%d%d",&n,&m,&k);
      for(i=0;i<m;i++)
      {
       scanf("%d%d",&a,&b);
       visit[a]=1;
       visit[b]=1;
       }
       for(i=0;i<k;i++)
       {
        scanf("%d%d%d",&a,&b,&c);
        g[a][b]=c;
        g[b][a]=c;
        if(visit[a]==1&&dis[b]>g[a][b]){
                                      dis[b]=g[a][b];
                                      }
        if(visit[b]==1&&dis[a]>g[a][b]){
                                      dis[a]=g[a][b];
                                      }
       }
        if(m==0){
                 for(i=2;i<=n;i++){
                 dis[i]=g[1][i];
                 }
                 visit[1]=1;
                }
       
        int sum=0;
        for(j=1;j<=n;j++)
        {
         
          int min=999999;
          for(i=1;i<=n;i++)
          {
           if(dis[i]<min&&!visit[i]){
                                     min=dis[i];
                                     k=i;
                                     }
           }
           if(min>=999999)break;
           visit[k]=1;
           sum+=min;
           for(i=1;i<=n;i++)
           {
             if(!visit[i]&&dis[i]>g[i][k]){
                                           dis[i]=g[i][k];
                                           }
           }
        }
        int flag=1;
        for(i=1;i<=n;i++)
        {
         if(!visit[i]){
                       flag=0;
                       break;
                       }
        }
        if(flag==0)printf("-1\n");
        else printf("%d\n",sum);
    }
    return 0;
}

回复列表 (共1个回复)

沙发

请大家帮忙看看,万分感谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册