ZOJ1406 || POJ 1251 Jungle Road,就是道裸的MST。。。。

Prime+heap+邻接矩阵

Source Code

Problem: 1251 User: imutzcy
Memory: 740K Time: 0MS
Language: G++ Result: Accepted

  • Source Code
    # include<cstdio>
    # include<cstring>
    # include<queue>
    # include<climits>
    # include<iostream>
    using namespace std;
    
    # define N 30
    # define INF INT_MAX
    
    
    struct node
    {
    	int u,dis;
    	node(){}
    	node(int uu,int dd):u(uu),dis(dd){}
    	bool operator < (const node &a) const
    	{
    		return dis>a.dis;
    	}
    };
    
    int n,m,map[N][N],d[N],see[N];
    priority_queue<node> q;
    
    int prime(int s)
    {
    	int v,u,res=0;
    	while(!q.empty())
    		q.pop();
    	memset(see,0,sizeof(see));
            d[s]=0;
    	q.push(node(s,0));
    	while(!q.empty())
    	{
    		node now=q.top();
    		q.pop();
    		u=now.u;
    		if(!see[u])
    		{
    			see[u]=1;
    			res+=now.dis;
    			for(v=1;v<=n;v++)
    				if(!see[v]&&map[u][v]<d[v])
    				{
    					d[v]=map[u][v];
    					q.push(node(v,map[u][v]));
    				}
    		}
    	}
    	return res;
    }
    
    /*void init()
    {
    	int i,j;
    	for(i=1;i<=n;i++)
    	{
    		d[i]=INF;
    		for(j=1;j<=n;j++)
    			map[i][j]=INF;
    	}
    }
    */
    void init()  
    {  
        char from,to;  
        int num,i,j,len,a,b;  
        for(i=1;i<=n;i++)
    	{
    		d[i]=INF;
    		for(j=1;j<=n;j++)
    			map[i][j]=INF;
    	} 
        getchar();  
        for(i=1; i<n; i++)  
        {  
            cin>>from>>num;  
            a = from - 'A' + 1;  
            while( num-- )  
            {  
                cin>>to>>len;  
                b = to -'A' + 1;  
                map[a][b] = map[b][a] = len;
            }  
            getchar();  
        }  
    }  
    int main()  
    {  
        while(cin>>n,n)  
        {  
            init();
            printf("%d\n",prime(1));//根节点从1开始 
        }  
    	return 0;  
    }  

 

POJ 对这题格式有问题。。。坑了我7次的RE。。。。ZOJ 用scanf无压力,擦。

 

 

Prime+heap+邻接表

Source Code

Problem: 1251 User: imutzcy
Memory: 740K Time: 0MS
Language: G++ Result: Accepted

  • Source Code
    # include<cstdio>
    # include<cstring>
    # include<queue>
    # include<vector>
    # include<climits>
    # include<iostream>
    using namespace std;
    
    const int maxn=30;
    const int maxm=1000;
    const int inf=INT_MAX;
    typedef pair<int,int> node;
    
    struct edge
    {
    	int u,v,w,next;
    }e[maxm];
    
    struct cmp
    {
    	bool operator()(const node &a,const node &b)const
    	{
    		return a.second>b.second;
    	}
    };
    
    int n;
    int num,head[maxn];
    int dis[maxn],vis[maxn];
    priority_queue<node,vector<node>,cmp> q;
    
    inline void add(int u,int v,int w)
    {
    	e[num].u=u;
    	e[num].v=v;
    	e[num].w=w;
    	e[num].next=head[u];
    	head[u]=num++;
    }
    
    void addedge(int u,int v,int w)
    {
    	add(u,v,w);
    	add(v,u,w);
    }
    
    int prime(int s)
    {
    	int i,u,v,mincost=0;
    	dis[s]=0;
    	q.push(make_pair(s,0));
    	while(!q.empty())
    	{
    		node a=q.top();
    		q.pop();
    		u=a.first;
    		if(vis[u])
    			continue;
    		vis[u]=1;
    		mincost+=a.second;
    		for(i=head[u];i!=-1;i=e[i].next)
    		{
    			v=e[i].v;
    			if(!vis[v]&&e[i].w<dis[v])
    			{
    				dis[v]=e[i].w;
    				q.push(make_pair(v,e[i].w));
    			}
    		}
    	}
    	return mincost;
    }
    
    
    void init(int n)
    {
    	num=0;
    	memset(head,-1,sizeof(head));
    	memset(vis,0,sizeof(vis));
    	for(int i=0;i<=n;i++)
    	{
    		dis[i]=inf;
    		vis[i]=0;
    	}
    }
    
    void input()  
    {  
        init(n);
    	char from,to;  
        int Num,i,j,len,a,b;  
        getchar();  
        for(i=1; i<n; i++)  
        {  
            cin>>from>>Num;  
            a = from - 'A' + 1;  
            while( Num-- )  
            {  
                cin>>to>>len;  
                b = to -'A' + 1;
                addedge(a,b,len);
            }  
            getchar();  
        }  
    }  
    
    
    int main()  
    {  
        while(cin>>n,n)  
        {  
            input();
            printf("%d\n",prime(1));  
        }
    	return 0;  
    }  
    
    
    
    

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值