学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
 13 12
发新话题
打印

kruskal算法的题 哪有问题啊 总TLE

kruskal算法的题 哪有问题啊 总TLE

Constructing Roads
Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 328   Accepted Submission(s) : 104



Problem Description


There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected.

We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.



Input


The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.

Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.



Output


You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum.



Sample Input


3
0 990 692
990 0 179
692 179 0
1
1 2

Sample Output


179

Source


kicc


Recommend


Eddy

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX=3000;
int Map[MAX][MAX]={0},S[MAX]={0},sum=0;

struct ArcInfo{
    int front;
    int rear;
    int weight;
};
ArcInfo A[MAX];

bool cmp(ArcInfo a,ArcInfo b){
    return a.weight<b.weight;
}


int Find(int v){
    int i=v;
    while(S[i]>0) i=S[i];
    return i;
}

void Kruskal(int n,int cnt,int arc){
    int i=0,j=0;
    int v1,v2;
    while(i<n-1-cnt&&j<arc)
    {
        v1=Find(A[j].front);
        v2=Find(A[j].rear);
        if(v1!=v2)
        {
            sum+=A[j].weight;
            S[v1]=v2;
            ++i;
        }
        ++j;
    }
}
   
int main(){
    int n;
    while(scanf("%d",&n)&&n)
    {
        int i,j;
        for(i=0;i<n;++i)
            for(j=0;j<n;++j)
                scanf("%d",&Map[i][j]);
        int arc=0;       //记录边数
        for(i=0;i<n;++i)
            for(j=0;j<n;++j)
                if(Map[i][j])   
                {
                    A[arc].front=i;
                    A[arc].rear=j;
                    A[arc].weight=Map[i][j];
                    Map[i][j]=Map[j][i]=0;
                    ++arc;
                }
        int cnt,x,y;
        scanf("%d",&cnt);
        for(i=0;i<cnt;++i)
        {
            scanf("%d%d",&x,&y);
            S[x-1]=y-1;
        }
        sort(A,A+arc,cmp);
        Kruskal(n,cnt,arc); //n结点数,cnt已连边数
        printf("%d\n",sum);
        
    }
    return 0;
}

TOP

........................



[ 本帖最后由 雨中飛燕 于 2008-5-5 20:13 编辑 ]
C/C++讨论群:46520219 3996098 21035626 57909089
免费的C/C++算法学习论坛:http://yzfy.org

TOP

ls最近真闲啊~~
是不是着急找LG呢
出售C语言经典视频、资料与工具光盘 20元一张 想要E-MAIL
lichuanliang007@yahoo.com.cn

TOP

貌似楼主这样写有死循环的危险(还没仔细看)

还有,楼上是什么意思

C/C++讨论群:46520219 3996098 21035626 57909089
免费的C/C++算法学习论坛:http://yzfy.org

TOP

谁给个用并查集实现kruskal算法的码..
-,-

TOP

LS的再灌水 拖出去割小JJ ..

TOP

-,- 那你给个思路

TOP

你的只是没有加优化的并查集,加上路径压缩和和rank合并再试试吧
10楼的你不要指望你的楼上现在帮得了你什么



[ 本帖最后由 雨中飛燕 于 2008-5-5 21:08 编辑 ]
C/C++讨论群:46520219 3996098 21035626 57909089
免费的C/C++算法学习论坛:http://yzfy.org

TOP

闪"银"..

TOP

!!!!!!!!!!!!!!!!

[ 本帖最后由 菜鸟选手 于 2008-5-5 22:07 编辑 ]

TOP

 13 12
发新话题