POJ 1251 Jungle Roads(Prim+Kruscal)

Prim:

一开始自己写了个函数找字母和数字对应关系WA,利用ASCII就对了。。。

仔细一看26个字母写错了。。。敲代码的时候就担心这个问题还检查过还是错了,引以为戒!

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>

#define INF 0x3f3f3f3f

using namespace std;

char ch[30]="0ABCDEFGHIGKLMNOPQRSTUVWXYZ";
int n;
int g[30][30];
int dis[30];
int mark[30];


int findch(char x){
    for(int i=1;i<=26;i++)
        if(ch[i]==x)return i;
    return -1;
}

void Prim(){
    memset(mark,0,sizeof(mark));
    memset(dis,0x3f,sizeof(dis));
    int ans=0;
    dis[1]=0;
    for(int i=0;i<n;i++){
        int minn=INF,index;
        for(int j=1;j<=n;j++){
            if(!mark[j]&&dis[j]<minn){
                minn=dis[j];
                index=j;
            }
        }
        if(minn==INF)break;
        ans+=minn;
        mark[index]=1;
        for(int j=1;j<=n;j++){
            if(!mark[j]){
                dis[j]=min(g[index][j],dis[j]);
                //有些点可能第一次找不是最短,但下一次是,但下一个点不能到达该点
            }
        }
    }
    printf("%d\n",ans);
}

int main(){
    while(scanf("%d",&n),n){
        memset(g,0x3f,sizeof(g));

        char x,y;
        int d,m;
        for(int i=1;i<n;i++){
            scanf(" %c %d",&x,&m);
            int a=x-'A'+1;
            while(m--){
                scanf(" %c %d",&y,&d);
                int b=y-'A'+1;
                if(g[a][b]>d)
                    g[a][b]=g[b][a]=d;
            }
        }
        Prim();
    }
    return 0;
}

Kruscal:

遍历全图找最短边会超时,因为这道题边数已知,可以把边从小到大排序然后从1号到末尾逐个尝试

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>

#define INF 0x3f3f3f3f

using namespace std;

int n;
int g[30][30];
int tree[30];

struct node{
    int s,e,w;
}edge[400];
int index;

int  find(int x){
    if(x==tree[x])return x;
    else return tree[x]=find(tree[x]);
}

void Kruscal(){
    for(int i=1;i<=n;i++)
        tree[i]=i;

    int cnt=n-1,ans=0,t=0;
    while(cnt){
        int a,b,c;
        a=edge[t].s;
        b=edge[t].e;
        c=edge[t++].w;

        int ra=find(a);
        int rb=find(b);
        if(ra!=rb){
            tree[rb]=ra;
            ans+=c;
            cnt--;
        }
    }
    printf("%d\n",ans);
}

bool _compare(node a,node b){
    return a.w<b.w;
}

int main(){
    while(scanf("%d",&n),n){
        memset(g,0x3f,sizeof(g));

        char x,y;
        int d,m;
        index=0;
        for(int i=1;i<n;i++){
            scanf(" %c %d",&x,&m);
            int a=x-'A'+1;
            while(m--){
                scanf(" %c %d",&y,&d);
                int b=y-'A'+1;
                edge[index].e=a;
                edge[index].s=b;
                edge[index].w=d;
                index++;
            }
        }
        sort(edge,edge+index,_compare);
        Kruscal();
    }
    return 0;
}

TLE 

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>

#define INF 0x3f3f3f3f

using namespace std;

char ch[30]="0ABCDEFGHIGKLMNOPQRSTUVWXYZ";
int n;
int g[30][30];
int tree[30];


int findch(char x){
    for(int i=1;i<=26;i++)
        if(ch[i]==x)return i;
    return -1;
}

int find(int x){
    if(x==tree[x])return x;
    else return tree[x]=find(tree[x]);
}

void Kruscal(){
    for(int i=1;i<=n;i++)
        tree[i]=i;
    int ans=0,cnt=n-1;
    while(cnt){
        int a,b,minn=INF;
        for(int i=1;i<n;i++){
            for(int j=i;j<=n;j++){
                if(minn>g[i][j]){
                    minn=g[i][j];
                    a=i,b=j;
                }
            }
        }
        int ra=find(a);
        int rb=find(b);
        if(ra!=rb){
            tree[rb]=ra;
            cnt--;
            ans+=minn;
        }
        g[a][b]=INF;
    }
    printf("%d\n",ans);
}

int main(){
    while(scanf("%d",&n),n){
        memset(g,0x3f,sizeof(g));

        char x,y;
        int d,m;
        for(int i=1;i<n;i++){
            getchar();
            scanf("%c %d",&x,&m);
            int a=findch(x);
            while(m--){
                getchar();
                scanf("%c %d",&y,&d);
                int b=findch(y);
                if(g[a][b]>d)
                    g[a][b]=d;
            }
        }
        Kruscal();
    }
}
扫描二维码关注公众号,回复: 9052748 查看本文章
发布了62 篇原创文章 · 获赞 7 · 访问量 1644

猜你喜欢

转载自blog.csdn.net/qq_43331910/article/details/100369481
今日推荐