• 最小生成树 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;
    } 
    

      

  • 相关阅读:
    DLL编写教程
    Ogre 配置
    LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    C++编译,链接错误总结
    git基本操作
    实习第33天
    HTTP状态码整理
    Window下的WebStorm快捷键操作
    告别div,可以代替div的几个标签
    实习20天
  • 原文地址:https://www.cnblogs.com/wwq-19990526/p/11777880.html
Copyright © 2020-2023  润新知