zoukankan      html  css  js  c++  java
  • 最小生成树 hdu1301

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301

    题目描述:在一个地方,有一些村庄,村庄之间有一些路,现告诉你输入n个村庄数目,接下来n-1行信息如下,第一个字母表示哪个村庄,第二个数表示这个村庄有k条路通往其他村庄,接下来的k对信息分别表示村庄通往的村庄和距离。求保留哪些路使得总路程最短(即维修费最短)

    ac代码:

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    typedef long long ll;
    const ll maxn=2e10;
    ll d[26][26];
    int vis[26];
    //优先队列按从大到小的顺序排列的,重写小于号,与原号相反即可。 
    struct node{
    	int z,v,value;
    	bool operator< (const node &a) const
    	{
    		return value>a.value;
    	}
    };
    int main()
    {
    	int n;
    	while(cin>>n&&n)
    	{
    		char c,ct;
    		int k,ds;
    		node pos;
    		initd();
    		vector<node> a[26];
    		memset(vis,0,sizeof(vis));
    		for(int i=0;i<n-1;i++)
    		{
    			cin>>c>>k;
    			for(int j=0;j<k;j++)
    			{
    				cin>>ct>>pos.value;
    				pos.z=c-'A';
    				pos.v=ct-'A';
    				a[c-'A'].push_back(pos);//双向添加路。 
    				pos.v=c-'A';
    				pos.z=ct-'A';
    				a[ct-'A'].push_back(pos);
    			}
    		}
    		ll ans=0;
    		priority_queue<node> s;//建立优先队列 
    		vis[0]=1;
    		for(int i=0;i<a[0].size();i++)
    			s.push(a[0][i]);
    		while(!s.empty())
    		{
    			node p=s.top();
    			s.pop();
    			if(!vis[p.v])
    			{
    				//cout<<"点"<<char('A'+p.v)<<" 价值 "<<p.value<<endl; 
    				ans+=p.value;
    				vis[p.v]=1;
    				for(int i=0;i<a[p.v].size();i++)
    					s.push(a[p.v][i]);
    			}
    		}
    		cout<<ans<<endl;
    	}
    	return 0;
    } 
    

      

  • 相关阅读:
    死锁篇
    java线程池
    sql server 多行数据指定字符串拼接
    动态提交 表格
    ABP
    DDD学习
    sql 语句插入数据返回id
    Post方式提交,通过上下文HttpContext,Request[""]获取
    JQ的过滤隐藏
    sql 查询有多少行
  • 原文地址:https://www.cnblogs.com/wwq-19990526/p/11777880.html
Copyright © 2011-2022 走看看