HDU1827 Summer Holiday 强连通 Tarjan 缩点 统计
来源:互联网 发布:小猪cms微信o2o系统 编辑:程序博客网 时间:2024/05/05 21:21
中文题一道,好题啊,读题简单多了,做起来也不难,就是缩点,缩点完成后,入度为0的点 就是需要主人公特意需要去打电话的点,缩点后 对于某一个团的最小话费就很好求了,直接暴力查找就可以了,
#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#define ll long long#define eps 1e-7#define inf 0xfffffffconst ll INF = 1ll<<61;using namespace std;//vector<pair<int,int> > G;//typedef pair<int,int > P;//vector<pair<int,int> > ::iterator iter;////map<ll,int >mp;//map<ll,int >::iterator p;//typedef struct Node {int from,to;int nex;};Node edge[1000 * 10];int head[2000 + 10],Stack[2000 + 10],low[2000 + 10],dfn[2000 + 10],id[2000 + 10],w[1000 + 10];bool vis[2000 + 10];int tot,vis_num,stack_num,scc_num;void clear() {memset(head,-1,sizeof(head));memset(Stack,0,sizeof(Stack));memset(low,0,sizeof(low));memset(dfn,-1,sizeof(dfn));memset(id,0,sizeof(id));memset(vis,false,sizeof(vis));memset(w,0,sizeof(w));memset(edge,0,sizeof(edge));tot = 0;vis_num = 0;stack_num = 0;scc_num = 0;}void addedge(int u,int v) {edge[tot].from = u;edge[tot].to = v;edge[tot].nex = head[u];head[u] = tot++;}void tarjan(int v) {dfn[v] = low[v] = ++vis_num;vis[v] = true;Stack[stack_num++] = v;for(int i=head[v];i!=-1;i=edge[i].nex) {int u = edge[i].to;if(dfn[u] == -1) {tarjan(u);low[v] = min(low[u],low[v]);}else if(vis[u])low[v] = min(low[v],dfn[u]);}int tmp;if(low[v] == dfn[v]) {scc_num++;do {tmp = Stack[--stack_num];id[tmp] = scc_num;vis[tmp] = false;}while(tmp != v);}}void cal(int n) {for(int i=1;i<=n;i++)if(dfn[i] == -1)tarjan(i);}int main() {int n,m;while(scanf("%d %d",&n,&m) == 2) {clear();for(int i=1;i<=n;i++)scanf("%d",&w[i]);int a,b;while(m--) {scanf("%d %d",&a,&b);addedge(a,b);}cal(n);int in[2000 + 10];//入度int hehe[2000 + 10];//话费memset(in,0,sizeof(in));for(int i=0;i<tot;i++) {int u = edge[i].from,v = edge[i].to;if(id[u] != id[v])in[ id[v] ]++;}int ans1 = 0;for(int i=1;i<=scc_num;i++) {if(in[i] == 0)ans1++;hehe[i] = inf;}for(int i=1;i<=n;i++) {int tmp = id[i];if(in[tmp] == 0)hehe[tmp] = min(hehe[tmp],w[i]);}int ans2 = 0;for(int i=1;i<=scc_num;i++)if(hehe[i] != inf)ans2 += hehe[i];printf("%d %d\n",ans1,ans2);}returnEXIT_SUCCESS;}
1 0
- HDU1827 Summer Holiday 强连通 Tarjan 缩点 统计
- [HDU1827]Summer Holiday(Tarjan缩点+强连通分量)
- HDU1827 Summer Holiday 解题报告【tarjan/强连通分量+缩点】
- HDU1827:Summer Holiday【强连通】
- hdu1827 Summer Holiday(tarjan+ 缩点)
- 【HDU1827】Summer Holiday(Tarjan缩点)
- HDU1827 Summer Holiday(强连通+缩点+最小传递费用)
- hdu1827 Summer Holiday【强连通+贪心】
- hdu1827 Summer Holiday(强连通,缩点建图)
- hdu1827 Summer Holiday(Tarjan缩点+贪心)
- hdu1827 Summer Holiday (Tarjan)
- HDU ACM 1827 Summer Holiday->强连通分量+缩点(tarjan算法)
- HDU1827:Summer Holiday(缩点 & 贪心)
- hdu1827强连通+缩点
- HDU 1827 Summer Holiday (强连通分量+缩点)
- 【强连通分量+缩点】 HDOJ 1827 Summer Holiday
- HDU 1827 - Summer Holiday (强连通 + 缩点)
- HDU 1827 Summer Holiday 强连通分量缩点
- RubyGems 常用命令
- Cocos2d-x之塔防(二)让怪物跑起来
- 《雷神之锤III》里求平方根的函数
- onContextItemSelected 、 onMenuItemSelected
- 【50个最受网友欢迎的HTML5资源下载列表】
- HDU1827 Summer Holiday 强连通 Tarjan 缩点 统计
- What is Android?
- Android源码50例汇总,欢迎各位下载
- java编写程序查找出在一个字符串中出现次数最多的字母
- thinkphp3.2开发排错一例——查询语言之SQL查询
- Search in Rotated Sorted Array
- 安卓开发资料大集合,很多都是51CTO中的推荐材料,值得学习! ...
- 通过oracle任务计划定期备份数据库
- Json解析工具Jackson(简单应用)