UVALive 4848 Tour Belt

F - Tour Belt
Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Description

Download as PDF
 
Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands scattered in the southern and western coasts of Korea. The Korea Tourism Organization (KTO) plans to promote a new tour program on these islands. For this, The KTO wants to designate two or more islands of the archipelago as a tour belt.

There are n islands in the archipelago. The KTO focuses on the synergy effect created when some islands are selected for a tour belt. Synergy effects are assigned to several pairs of islands. A synergy effect SE(uv) or SE(vu) between two islands u and v is a positive integer which represents a value anticipated when both u and v are included in a tour belt. The KTO wants to select two or more islands for the tour belt so that the economic benefit of the tour belt is as high as possible.

To be precise, we define a connected graph G = (VE), where V is a set of n vertices and E is a set of m edges. Each vertex of V represents an island in the archipelago, and an edge (uv) of E exists if a synergy effect SE(uv) is defined between two distinct vertices (islands) uand v of V. Let A be a subset consisting of at least two vertices in V. An edge (uv) is an inside edge of A if both u and v are in A. An edge(uv) is a border edge of A if one of u and v is in A and the other is not in A.

A vertex set B of a connected subgraph of G with 2$ \le$B|$ \le$n is called a candidate for the tour belt if the synergy effect of every inside edge of B is larger than the synergy effect of any border edge of B. A candiate will be chosen as the final tour belt by the KTO. There can be many possible candidates in G. Note that V itself is a candidate because there are no border edges. The graph in Figure 1(a) has three candidates {1,2}, {3,4} and {1,2,3,4}, but {2,3,4} is not a candidate because there are inside edges whose synergy effects are not larger than those of some border edges. The graph in Figure 1(b) contains six candidates, {1,2}, {3,4}, {5,6}, {7,8}, {3,4,5,6} and {1,2,3,4,5,6,7,8}. But {1,2,7,8} is not a candidate because it does not form a connected subgraph of G, i.e., there are no edges connecting {1,2} and {7,8}.

 

\epsfbox{p4848.eps}

 

Figure 1. Graphs and their good subsets marked by gray ellipses.

The KTO will decide one candidate in G as the final tour belt. For this, the KTO asks you to find all candidates in G. You write a program to print the sum of the sizes of all candidates in a given graph G. For example, the graph in Figure 1(a) contains three candidates and the sum of their sizes is 2 + 2 + 4 = 8, and the graph in Figure 1(b) contains six candidates and the sum of their sizes is 2 + 2 + 2 + 2 + 4 + 8 = 20.

 

Input

Your program is to read input from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case starts with a line containing two integers n ( 2$ \le$n$ \le$5, 000) and m ( 1$ \le$m$ \le$$ {​{n(n-1)} \over 2}$), where n represents the number of vertices (islands) and m represents the number of edges of a connected graph G. Islands are numbered from 1 to n. In the following m lines, the synergy effects assigned to m edges are given; each line contains three integers, uv, and k ( 1$ \le$u$ \ne$v$ \le$n1$ \le$k$ \le$105), where k is the synergy effect between two distinct islands u and v, i.e., SE(uv) = SE(uv) = k.

 

Output

Your program is to write to standard output. Print exactly one line for each test case. Print the sum of the sizes of all candidates for a test case.

The following shows sample input and output for two test cases.

 

Sample Input

 

2
4 6
1 2 3
2 3 2
4 3 4
1 4 1
2 4 2
1 3 2
8 7
1 2 2
2 3 1
3 4 4
4 5 3
5 6 4
6 7 1
7 8 2

 

Sample Output

 

8
20

题意:在一个联通无向图里面找一个联通子图,如果这个联通子图里面的最小边权大于
子图和非子图的连边的最大值,那么ans += 联通子图的点数目。输出ans。
思路:按边从大到小排序,然后一个个加进来,如果原来这条边的两个点是联通的,那么不理
不连通就去判断是否符合条件,(纯暴力。。)

#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
#define INF 0x3f3f3f3f
#define FINF 1e9
#define ll long long
#define BUG printf("hehe!~\n")
using namespace std;

const int N=5010;
const int M=22501000;

struct Edge
{
    int u,v,w;
}edge[M];

bool cmp(Edge A,Edge B)
{
    return A.w>B.w;
}

int cur[N+N];
int n,m;
int fa[N];

int findp(int x) {
    return fa[x]==x?x:fa[x]=findp(fa[x]);
}

void init()
{
    for(int i=0;i<=n;++i) fa[i]=i,cur[i]=1;
}

int connect(int fu,int fv)
{
    cur[fu]+=cur[fv];
    return cur[fu];
}

int main()
{
    int _;
    cin>>_;
    int u,v,w;
    int x,y,num;
    bool flag;
    int ans,cnt;
    while(_--) {
        scanf("%d%d",&n,&m);
        init();
        ans=0;
        for(int i=0;i<m;++i) {
            scanf("%d%d%d",&u,&v,&w);
            edge[i].u=u, edge[i].v=v, edge[i].w=w;
        }
        sort(edge,edge+m,cmp);
        num=n;
        for(int i=0;i<m;++i) {
            u=edge[i].u,v=edge[i].v,w=edge[i].w;
            int fu=findp(u);
            int fv=findp(v);
            if(fu!=fv) {
                num++;
                fa[fv]=num;
                fa[fu]=num;

                fa[num]=num;
                flag=true;
                cur[num]=cur[fv]+cur[fu];
                cnt=cur[num];

                int mn=INF,mx=-INF;
                for(int j=0;j<m;++j) {
                    Edge& e=edge[j];
                    x=findp(e.u);y=findp(e.v);
                    if(x==y&&x==num) mn=min(mn,e.w);
                    else if(x==num||y==num) {
                        mx=max(mx,e.w);
                    }
                }
                if(mn>mx) {
                    ans+=cnt;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/20120125llcai/p/4075106.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值