hdu 5739 割点
Fantasia
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1654 Accepted Submission(s): 429
The weight of a graph G is defined as follows:
1. If G is connected, then the weight of G is the product of the weight of each vertex in G.
2. Otherwise, the weight of G is the sum of the weight of all the connected components of G.
A connected component of an undirected graph G is a subgraph in which any two vertices are connected to each other by paths, and which is connected to no additional vertices in G.
The first line contains two integers n and m (2≤n≤105,1≤m≤2×105) -- the number of vertices and the number of edges.
The second line contains n integers w1,w2,...,wn (1≤wi≤109), denoting the weight of each vertex.
In the next m lines, each contains two integers xi and yi (1≤xi,yi≤n,xi≠yi), denoting an undirected edge.
There are at most 1000 test cases and ∑n,∑m≤1.5×106.
3 2
1 2 3
1 2
2 3
/*
hdu 5739 割点 problem:
给你一个无向图,G[i]为删除i点时,无向图的价值. 求 sum(i*G[i])%mod
如果当前是连通的,那么连通分量的价值为所有点权值的积(任意两个节点连通)
否则为拆分后的各个连通分量的价值的和 solve:
所以需要判断当前点是否是割点.
如果不是割点,只需要减去这个点的权值即可. 如果是割点,要减去这个连通分量的价值再加上拆散后的各个连通分量的值 最开始题意理解错了- -,而且模板有点问题,一直wa. hhh-2016-08-27 19:47:17
*/
#pragma comment(linker,"/STACK:124000000,124000000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <math.h>
#include <queue>
#include <map>
#define lson i<<1
#define rson i<<1|1
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
#define scanfi(a) scanf("%d",&a)
#define scanfl(a) scanf("%I64d",&a)
#define key_val ch[ch[root][1]][0]
#define inf 1e9
using namespace std;
const ll mod = 1e9+7;
const int maxn = 100005; struct Edge
{
bool cut ;
int v,next,w;
} edge[maxn*5]; int head[maxn],tot;
int low[maxn],dfn[maxn],Stack[maxn],index,top;
bool Instack[maxn],cut[maxn];
int bridge;
ll val[maxn],mul[maxn],ans[maxn],fans[maxn],tval[maxn];
void add_edge(int u,int v)
{
edge[tot].v = v,edge[tot].next = head[u],head[u] = tot++;
} ll tans =1 ; ll pow_mod(ll a,ll n)
{
ll cnt =1 ;
while(n)
{
if(n & 1) cnt = cnt*a%mod;
a = a*a%mod;
n >>= 1;
}
return cnt ;
}
int now;
vector<int> vec[maxn];
int from[maxn];
void Tarjan(int u,int ance,int pre)
{
int v;
vec[now].push_back(u);
from[u] = now;
low[u] = dfn[u] = ++index;
Stack[top++] = u;
Instack[u] = true;
tans = tans*val[u] % mod;
int son = 0;
for(int i= head[u]; i!= -1; i = edge[i].next)
{
v = edge[i].v;
if(v == pre){
continue;
}
if(!dfn[v])
{
son ++ ;
ll tp = tans;
Tarjan(v,ance,u);
low[u] = min(low[u],low[v]); if(u != pre && low[v] >= dfn[u])
{
cut[u] = true;
ll ta = tans * pow_mod(tp,mod-2)%mod;
// cout <<"node:" << u <<" ta:" <<ta <<endl;
ans[u] = (ans[u] + ta)%mod;
fans[u] = (fans[u] * ta) % mod;
}
}
else if(low[u] > dfn[v])
low[u] = dfn[v];
}
if(u == ance && son > 1)
cut[u] = true;
Instack[u] = false;
top --;
} void init(int n)
{
for(int i = 0; i <= n+1; i++)
{
head[i] = -1;
ans[i] = 0;
fans[i] = 1;
Instack[i]=cut[i]= 0;
dfn[i] = 0;
vec[i].clear();
}
tot=top=index=0;
} int main()
{
// freopen("in.txt","r",stdin);
int T,n,m,u,v; scanfi(T);
while(T--)
{ scanfi(n),scanfi(m);
init(n);
for(int i =1; i <= n; i++)
{
scanfl(val[i]);
fans[i] = 1;
}
for(int i = 0; i < m; i++)
{
scanfi(u),scanfi(v);
add_edge(u,v);
add_edge(v,u);
}
now = 1;
ll ob = 0;
for(int i = 1; i <= n; i++)
{
if(!dfn[i])
{
tans= 1;
Tarjan(i,i,-1);
tval[now] = tans;
ll amul = tans;
ob = (ob+tans) %mod;
// cout << "all:" <<tans<<endl;
for(int j = 0 ; j < vec[now].size(); j ++)
{
int to = vec[now][j]; // cout << to <<" " << fans[to] << endl;
if(to == i) continue;
ans[to] = (ans[to] + amul*pow_mod(fans[to]*val[to]%mod,mod-2)%mod);
if(ans[to] > mod) ans[to] -= mod;
}
now ++;
}
}
ll out = 0;
ll tm;
for(int i = 1; i <= n; i++)
{
// cout << fans[i] <<" " << ans[i] <<" " <<cut[i] << endl;
int tf = from[i];
if(cut[i])
{
tm = (ob - tval[tf] + ans[i] + mod)%mod;
}
else
{
if(vec[from[i]].size() > 1)
tm = (ob - tval[tf] + tval[tf]*pow_mod(val[i],mod-2)%mod + mod) % mod;
else
tm = (ob - tval[tf] + mod) % mod;
}
out = (out + i * tm % mod) % mod;
}
printf("%I64d\n",out);
}
return 0;
} /*
3
4 3
1 2 3 4
1 2
2 3
1 3 4 2
100000000 131231232 312354435 432134234
1 2
3 4 66
315142079 */
hdu 5739 割点的更多相关文章
- hdu 4587(割点的应用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 思路:题目的意思很简单,就是删除任意2个节点以及关联的边,求图的最大连通分量数.我们知道删除割点 ...
- HDU 5739 Fantasia 双连通分量 树形DP
题意: 给出一个无向图,每个顶点有一个权值\(w\),一个连通分量的权值为各个顶点的权值的乘积,一个图的权值为所有连通分量权值之和. 设删除顶点\(i\)后的图\(G_i\)的权值为\(z_i\),求 ...
- HDU 5739 Fantasia
可以将这个图转换成森林来进行树形dp求解.看了这篇具体教学才会的:http://www.cnblogs.com/WABoss/p/5696926.html 大致思路:求解一下点双连通分量(Tarjan ...
- HDU 4587 TWO NODES 割点
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意: 删除两个点,使连通块的数目最大化 题解: 枚举删除第一个点,然后对删除了第一个点的图跑 ...
- HDU 4587 TWO NODES 枚举+割点
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 TWO NODES Time Limit: 24000/12000 MS (Java/Other ...
- hdu 4587 推断孤立点+割点+ 删除点之后,剩下多少连通分量
做了非常久...... 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4587 先枚举删除的第一个点,第二个点就是找割点.没有割点当然也有答案 学到 ...
- HDU 3844 Mining Your Own Business(割点,经典)
题意: 给出一个连通图,要求将某些点涂黑,使得无论哪个点(包括相关的边)撤掉后能够成功使得剩下的所有点能够到达任意一个涂黑的点,颜料不多,涂黑的点越少越好,并输出要涂几个点和有多少种涂法. 思路: 要 ...
- Destroying the bus stations HDU - 2485(最小割点)
题意: 就是求最小割点 解析: 正向一遍spfa 反向一遍spfa 然后遍历每一条边,对于当前边 如果dis1[u] + dis2[v] + 1 <= k 那么就把这条边加入到网络流图中, 每 ...
- Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)
Key Vertex Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
随机推荐
- C语言博客作业--数组
一.PTA实验作业 题目1.求整数序列中出现次数最多的数 1.本题PTA提交列表 2.设计思路 定义整形变量n,max,count分别表示整数个数,出现次数最大值,出现次数.定义循环变量i,j. 输入 ...
- C语言总结报告
1.当初你是如何做出选择计算机专业的决定的? 经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 当初报考计算机专业,是看到计算机专业在当今社会有良 ...
- 【iOS】swift init构造器
这几天在使用 Swift 重写原来的一个运动社交应用 SportJoin. 为什么要重写呢? 首先因为实在找不到设计师给我作图; 其次, 我也闲不下来, 想找一些项目做, 所以只好将原来的代码重写了. ...
- mysql数据库的三范式的设计与理解
一般的数据库设计都需要满足三范式,这是最基本的要求的,最高达到6NF,但是一般情况下3NF达到了就可以 一:1NF一范式的理解: 1NF是关系型数据库中的最基本要求,就是要求记录的属性是原子性,不可分 ...
- LeetCode & Q14-Longest Common Prefix-Easy
String Description: Write a function to find the longest common prefix string amongst an array of st ...
- HttpClient 上传多个文件
using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient()) { client.BaseAddress = ...
- 为什么 asnyc await 可以提高web程序的吞吐量
(转网上一段话) Web程序天生就是多线程的,且web线程都是跑的线程池线程(使用线程池线程是为了避免不断创建.销毁线程所造成的资源成本浪费),而线程池线程可使用线程数量是一定的,尽管可以设置,但它还 ...
- T410升级笔记
T410 win7 旗舰版 32 sp1 三星 DDR3 1066 mhz core i5 M 540 2.53GHZ 双核 日立 HTS725032A9A364 320G/7200转/分 sa ...
- EasyUI datagrid动态生成列
任务描述:根据用户选择时间段,生成列数据,如图
- Django中自定义过滤器的使用
我在这里做的是: 从数据库查出id递增的一些信息,展示在前台. 编写一个过滤器判断查出数据的id是偶数的返回True 奇数返回False 1 创建项目,创建应用,注册应用,配置settings.py文 ...