hdu - 1827 Summer Holiday (强连通)
2015-08-14 13:17
363 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1827
缩点后,统计入度为0的点有多少个,那么这些点都是需要被通知的,但是这些点可能也是被缩的,所以每次在这个点所属集合找一个最小值即可.
缩点后,统计入度为0的点有多少个,那么这些点都是需要被通知的,但是这些点可能也是被缩的,所以每次在这个点所属集合找一个最小值即可.
#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> #include <string> #include <set> #include <functional> #include <numeric> #include <sstream> #include <stack> #include <map> #include <queue> #define CL(arr, val) memset(arr, val, sizeof(arr)) #define ll long long #define inf 0x7f7f7f7f #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define L(x) (x) << 1 #define R(x) (x) << 1 | 1 #define MID(l, r) (l + r) >> 1 #define Min(x, y) (x) < (y) ? (x) : (y) #define Max(x, y) (x) < (y) ? (y) : (x) #define E(x) (1 << (x)) #define iabs(x) (x) < 0 ? -(x) : (x) #define OUT(x) printf("%I64d\n", x) #define lowbit(x) (x)&(-x) #define Read() freopen("a.txt", "r", stdin) #define Write() freopen("dout.txt", "w", stdout); using namespace std; #define N 1100 //N为最大点数 #define M 2100 //M为最大边数 int n, m;//n m 为点数和边数 struct Edge{ int from, to, nex; bool sign;//是否为桥 }edge[M<<1]; int head , edgenum; void add(int u, int v){//边的起点和终点 Edge E={u, v, head[u], false}; edge[edgenum] = E; head[u] = edgenum++; } int DFN , Low , Stack , top, Time; //Low[u]是点集{u点及以u点为根的子树} 中(所有反向弧)能指向的(离根最近的祖先v) 的DFN[v]值(即v点时间戳) int taj;//连通分支标号,从1开始 int Belong ;//Belong[i] 表示i点属于的连通分支 bool Instack ; vector<int> bcc ; //标号从1开始 每个强连通分量包含原图中的点 void tarjan(int u ,int fa){ DFN[u] = Low[u] = ++ Time ; Stack[top ++ ] = u ; Instack[u] = 1 ; for (int i = head[u] ; ~i ; i = edge[i].nex ){ int v = edge[i].to ; if(DFN[v] == -1) { tarjan(v , u) ; Low[u] = min(Low[u] ,Low[v]) ; if(DFN[u] < Low[v]) { edge[i].sign = 1;//为割桥 } } else if(Instack[v]) Low[u] = min(Low[u] ,DFN[v]) ; } if(Low[u] == DFN[u]){ int now; taj ++ ; bcc[taj].clear(); do{ now = Stack[-- top] ; Instack[now] = 0 ; Belong [now] = taj ; bcc[taj].push_back(now); }while(now != u) ; } } void tarjan_init(int all){ memset(DFN, -1, sizeof(DFN)); memset(Instack, 0, sizeof(Instack)); top = Time = taj = 0; for(int i=1;i<=all;i++)if(DFN[i]==-1 )tarjan(i, i); //注意开始点标!!! } vector<int>G ; int du ; void suodian(){ memset(du, 0, sizeof(du)); for(int i = 1; i <= taj; i++)G[i].clear(); for(int i = 0; i < edgenum; i++){ int u = Belong[edge[i].from], v = Belong[edge[i].to]; if(u!=v) { G[u].push_back(v), du[v]++; // printf("%d %d\n",u,v); } } } void init(){memset(head, -1, sizeof(head)); edgenum=0;} int p ; int main() { //Read(); int a,b; while(~scanf("%d%d",&n,&m)) { init(); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); add(a,b); } tarjan_init(n); suodian(); int x=0,ans=0,y; for(int i=1;i<=taj;++i) { y=1<<30; if(du[i]==0) //出度为0点的个数 { x++; for(int j=0;j<bcc[i].size();++j) y=min(y,p[bcc[i][j]]); ans+=y; } } //printf("%d\n",j); printf("%d %d\n",x,ans); } return 0; }
相关文章推荐
- 灵活使用ARM汇编的WEAK关键字
- Solr 文章集成
- configure: error: C compiler cannot create executables
- HDU 3466
- C - We Love MOE Girls-----(2015 summer training #9)
- stringByAppendingPathComponent和stringByAppendingString的区别
- 没学过CSS等前端的我,也想美化一下自己的博客
- VxWorks/tornado环境搭建(Win 7 64位 corei5下试验成功)
- Codeforces Round #316 (Div. 2) A. Elections
- CentOS下安装hadoop
- NYOJ 1071 不可以!
- win10安装迅雷精简版处理方法---发布者不受信任
- HDU 1015 Safecracker (很棒的一道DFS)
- 八种主流NoSQL介绍,适用场景
- 【ODPS】TableTunnel单线程简单下载事例
- 1285 确定比赛名次【拓扑排序】
- C++ priority_queue的使用方法
- python调用wcf服务 实现网站对客户端的调用
- Objective-C 苹果开发文档 03 Working with Objects
- HDU 4324 Triangle LOVE