zoukankan      html  css  js  c++  java
  • POJ 1944:Fiber Communications

    Fiber Communications
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 4236   Accepted: 1276

    Description

    Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a new fiber-optic network. However, the barns are located in a circle around the edge of a large pond, so he can only connect pairs of adjacent barns. The circular configuration means that barn N is adjacent to barn 1. 

    FJ doesn't need to connect all the barns, though, since only certain pairs of cows wish to communicate with each other. He wants to construct as few 
    connections as possible while still enabling all of these pairs to communicate through the network. Given the list of barns that wish to communicate with each other, determine the minimum number of lines that must be laid. To communicate from barn 1 to barn 3, lines must be laid from barn 1 to barn 2 and also from barn 2 to barn 3(or just from barn 3 to 1,if n=3).

    Input

    * Line 1: Two integers, N and P (the number of communication pairs, 1 <= P <= 10,000) 

    * Lines 2..P+1: two integers describing a pair of barns between which communication is desired. No pair is duplicated in the list. 

    Output

    One line with a single integer which is the minimum number of direct connections FJ needs to make.

    Sample Input

    5 2
    1 3
    4 5
    

    Sample Output

    3

    Hint

    [Which connect barn pairs 1-2, 2-3, and 4-5.] 

    题意是给你1到N这么多的点,要求有P次连接,将P次连接中给的点连接起来,举例比如说1到3要连接有两种连接方法,1-2-3或者1-5-4-3。求满足所有连接中最少需要多少个线段连接。

    真没想到暴力竟然还能n*n这么暴。。。看了别人的想法之后,觉得精彩的地方第一点在于如果i 到i+1这个线段是断了的话,而要求连接的线段又恰好在这之间,(即只有一种方法将之连接,逆过去连接),这种时候的做法是将to[1]=start,to[end]=N+1,分成两段来想,还避免了那个断了的影响,觉得这种想法真是赞啊!!!

    还有一点是to数组的使用比我之前想象的简单多了,to[i]表示从i开始到to[i]已经连接上了,如果等于0直接pass掉,这样一个一个枚举也很简单方便。

    还有一点是duandian表示当前能够到达的最远的点,这里的使用也很赞。

    这三点真的值得我去好好研磨。

    代码:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <cstring>
    using namespace std;
    
    struct node
    {
    	int start;
    	int end;
    
    }node_one[10005];
    
    bool cmp(node node1,node node2)
    {
    	if(node1.start == node2.start)
    		return node1.end< node2.end;
    	
    	return node1.start<node2.start;
    }
    
    #define INF 0x3f3f3f3f
    
    int N,P,i,j,Q1,Q2,Qmin,Qmax,ans,h;
    int to[1005];
    
    int main()
    {
    	cin>>N>>P;
    	for(i=1;i<=P;i++)
    	{
    		cin>>Q1>>Q2;
    		node_one[i].start = min(Q1,Q2);
    		node_one[i].end = max(Q1,Q2);
    	}
    	sort(node_one+1,node_one+P+1,cmp);
    	
    	ans=INF;
    
    	for(i=1;i<=N;i++)
    	{
    		memset(to,0,sizeof(to));
    		for(j=1;j<=P;j++)
    		{
    			if(node_one[j].end>=i+1 && node_one[j].start<=i)
    			{
    				to[1]=max(to[1],node_one[j].start);
    				to[node_one[j].end]=N+1;
    			}
    			else
    			{
    				to[node_one[j].start]=max(to[node_one[j].start],node_one[j].end);
    			}
    		}
    		int duandian=0,result=0;
    		for(j=1;j<=N;j++)
    		{
    			if(to[j]==0)continue;
    			if(to[j]>duandian)
    			{
    				if(j>=duandian)
    				{
    					result+=(to[j]-j);
    				}
    				else
    				{
    					result+=(to[j]-duandian);
    				}
    				duandian=to[j];
    			}
    		}
    		ans=min(ans,result);
    	}
    	cout<<ans<<endl;
    	
    	return 0;
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    简单马周游问题1152siicly
    Sicily 1155. Can I Post the lette
    POJ 1007
    给定2个大小分别为n, m的整数集合,分别存放在两个数组中 int A[n],B[m],输出两个集合的交集。
    算法1--
    GAN
    为什么ConcurrentHashMap是弱一致的
    手写HASHMAP
    千万级规模高性能、高并发的网络架构经验分享
    Web 通信 之 长连接、长轮询(转)
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4785834.html
Copyright © 2011-2022 走看看