• POJ1251丛林之路题解


    POJ1251丛林之路题解

    题目

    链接

    http://poj.org/problem?id=1251

    字面描述

    Jungle Roads
    Time Limit: 1000MS Memory Limit: 10000K
    Total Submissions: 45084 Accepted: 21205
    Description

    The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to maintain. The Council of Elders must choose to stop maintaining some roads. The map above on the left shows all the roads in use now and the cost in aacms per month to maintain them. Of course there needs to be some way to get between all the villages on maintained roads, even if the route is not as short as before. The Chief Elder would like to tell the Council of Elders what would be the smallest amount they could spend in aacms per month to maintain roads that would connect all the villages. The villages are labeled A through I in the maps above. The map on the right shows the roads that could be maintained most cheaply, for 216 aacms per month. Your task is to write a program that will solve such problems.

    Input

    The input consists of one to 100 data sets, followed by a final line containing only 0. Each data set starts with a line containing only a number n, which is the number of villages, 1 < n < 27, and the villages are labeled with the first n letters of the alphabet, capitalized. Each data set is completed with n-1 lines that start with village labels in alphabetical order. There is no line for the last village. Each line for a village starts with the village label followed by a number, k, of roads from this village to villages with labels later in the alphabet. If k is greater than 0, the line continues with data for each of the k roads. The data for each road is the village label for the other end of the road followed by the monthly maintenance cost in aacms for the road. Maintenance costs will be positive integers less than 100. All data fields in the row are separated by single blanks. The road network will always allow travel between all the villages. The network will never have more than 75 roads. No village will have more than 15 roads going to other villages (before or after in the alphabet). In the sample input below, the first data set goes with the map above.
    Output

    The output is one integer per line for each data set: the minimum cost in aacms per month to maintain a road system that connect all the villages. Caution: A brute force solution that examines every possible set of roads will not finish within the one minute time limit.
    Sample Input

    9
    A 2 B 12 I 25
    B 3 C 10 H 40 I 8
    C 2 D 18 G 55
    D 1 E 44
    E 2 F 60 G 38
    F 0
    G 1 H 35
    H 1 I 35
    3
    A 2 B 10 C 40
    B 1 C 20
    0
    Sample Output

    216
    30
    Source

    Mid-Central USA 2002

    代码实现

    模板题,不进行思路详解

    #include
    #include
    #include
    using namespace std;
    
    const int maxn=100+10;
    const int inf=2e9;
    int n,ans;
    int lowcost[maxn];
    int c[maxn][maxn];
    bool vis[maxn];
    inline void Prim(){
    	//初始化 
    	memset(vis,false,sizeof(vis));
    	ans=0;
    	vis[1]=true;
    	for(int i=1;i<=n;i++)lowcost[i]=c[1][i];
    	//n-1条边的添加 
    	for(int i=1;i<n;i++){
    		int temp=inf;
    		int t=1;
    		//寻找离已添加最近的节点t 
    		for(int j=1;j<=n;j++){
    			if(!vis[j]&&lowcost[j]<temp){
    				temp=lowcost[j];
    				t=j; 
    			}
    		}
    		ans+=temp;
    		if(t==1)break;
    		vis[t]=true;
    		//更新未添加节点 
    		for(int j=1;j<=n;j++){
    			if(!vis[j]&&c[t][j]<lowcost[j])lowcost[j]=c[t][j];
    		}
    	}
    } 
    int main(){
    	while(1){
    		scanf("%d",&n);
    		if(!n)break;
    		memset(c,0x3f,sizeof(c));
    		for(int i=1;i<n;i++){
    			char op,op2;
    			int k,w;
    			scanf(" %c%d",&op,&k);
    			int u=op-'A'+1;
    			for(int j=1;j<=k;j++){
    				scanf(" %c%d",&op2,&w);
    				int v=op2-'A'+1;
    				c[u][v]=w;
    				c[v][u]=w;
    			} 
    		}
    		Prim();
    		printf("%d\n",ans);
    	}
    	return 0;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
  • 相关阅读:
    域环境提权姿势
    嵌入式常用计算神器EXCEL,欢迎各位推荐技巧,以保持文档持续更新,为其他人提供便利
    Uniapp 跳转回上一页面并刷新页面数据
    景联文科技:语音工程系列(一)——语音标注的应用场景
    C#上位机序列9: 批量读写+事件广播+数据类型处理
    nuc980学习笔记6 - 手把手教 源码编译和YAFFS2文件系统制作
    Java带APP的智慧工地项目源码
    Centos7配置静态IP详细步骤
    现代企业架构框架-数据架构
    MQ消息队列篇:三大MQ产品的必备面试种子题
  • 原文地址:https://blog.csdn.net/weixin_42178241/article/details/126033865