考研路茫茫——空调教室HDU2242(Tarjan缩点)

题意:http://acm.hdu.edu.cn/showproblem.php?pid=2242

给你一个图,问你缩完点树上割边的做小绝对值差。

思路:

这题核算起来整整做了我一天(即24个小时)!!!一开始是MLE了近20发,然后TLE5、6发,再WA了一个晚上加一个下午。

有一种自闭是你突然对任何事物都失去追求:期中考?0分算了,这题再错我不学了还不行吗。

再加上HDU的评测机本来就很迷,该RE的判MLE,我N开1还MLE。服了嗷 !

算法里要注意的就是:Tarjan里因为你补了一条反向边,所以edge^1和edge都标记掉不要再dfs了。

然后Head链式前向星数组必须和tot变量初始化一致 -1 or 0,i!=-1 or 0,不然就炸了。(幸亏我同学帮我找到错误,不然我一个礼拜都难受)

  1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
  2 #include <cstdio>//sprintf islower isupper
  3 #include <cstdlib>//malloc  exit strcat itoa system("cls")
  4 #include <iostream>//pair
  5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin);
  6 #include <bitset>
  7 #include <map>
  8 #include<unordered_map>
  9 #include <vector>
 10 #include <Stack>
 11 #include <set>
 12 #include <string.h>//strstr substr
 13 #include <string>
 14 #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
 15 #include <cmath>
 16 #include <deque>
 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
 18 #include <vector>//emplace_back
 19 //#include <math.h>
 20 #include <cassert>
 21 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
 22 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
 23 #include <iomanip>
 24
 25 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
 26 //******************
 27 clock_t __STRAT,__END;
 28 double __TOTALTIME;
 29 void _MS(){__STRAT=clock();}
 30 void _ME(){__END=clock();__TOTALTIME=(double)(__END-__STRAT)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
 31 //***********************
 32 #define rint register int
 33 #define fo(a,b,c) for(rint a=b;a<=c;++a)
 34 #define fr(a,b,c) for(rint a=b;a>=c;--a)
 35 #define mem(a,b) memset(a,b,sizeof(a))
 36 #define pr printf
 37 #define sc scanf
 38 #define ls rt<<1
 39 #define rs rt<<1|1
 40 typedef pair<int,int> PII;
 41 typedef vector<int> VI;
 42 typedef long long ll;
 43 const double E=2.718281828;
 44 const double PI=acos(-1.0);
 45 const ll INF=(1LL<<60);
 46 const int inf=(1<<30);
 47 const double ESP=1e-9;
 48 const int mod=(int)1e9+7;
 49 const int N=(int)40004;
 50
 51 int val[N];
 52 int peo[N];
 53 int dfn[N],low[N],Stack[N],color[N];
 54 bool vis[N];
 55 int deep,top,sccn;//sccn是团;
 56 int tot,head[N];//edge;
 57 void Init()
 58 {
 59     tot=-1;
 60     deep=sccn=0;
 61     top=0;
 62     mem(Stack,0);
 63     mem(low,0);
 64     mem(dfn,0);
 65     mem(vis,0);
 66     mem(head,-1);
 67     mem(val,0);
 68 }
 69 struct node
 70 {
 71     int next,to;
 72     bool vis;
 73 }edge[N];
 74 void add(int from,int to)
 75 {
 76     ++tot;
 77     edge[tot].to=to;
 78     edge[tot].next=head[from];
 79     head[from]=tot;
 80 }
 81 void Tarjan(int u,int fa)
 82 {
 83     dfn[u]=++deep;
 84     low[u]=deep;
 85     vis[u]=true;
 86     Stack[++top]=u;
 87     for(int i=head[u];i!=-1;i=edge[i].next)
 88     {
 89         int to=edge[i].to;
 90         if(edge[i].vis) continue;
 91         edge[i].vis=edge[i^1].vis=1;
 92         if(!dfn[to])
 93         {
 94             Tarjan(to,u);
 95             low[u]=min(low[u],low[to]);
 96         }
 97         else if(vis[to])
 98             low[u]=min(low[u],low[to]);
 99     }
100     if(dfn[u]==low[u])
101     {
102         ++sccn;
103         do{
104             vis[Stack[top]]=false;
105             color[Stack[top]]=sccn;
106             val[sccn]+=peo[Stack[top]];
107         }while(Stack[top--]!=u);
108     }
109 }
110 struct
111 {
112     int u,v;
113 }e[N];
114 int ans;
115 int sum;
116 int dfs(int u,int fa)
117 {
118     int temp=val[u];
119     vis[u]=1;
120     for(int i=head[u];i;i=edge[i].next)
121     {
122         int to=edge[i].to;
123         if(to!=fa&&!vis[to])
124         {
125             temp+=dfs(to,u);
126         }
127     }
128     ans=min(ans,abs(sum-temp*2));
129     return temp;
130 }
131
132 int main()
133 {
134     int n,m;
135     while(~sc("%d%d",&n,&m))
136     {
137         Init();
138         sum=0;
139         for(int i=1;i<=n;++i)
140             sc("%d",&peo[i]),sum+=peo[i];
141         mem(edge,0);
142         for(int i=1;i<=m;++i)
143         {
144             int u,v;
145             sc("%d%d",&u,&v);
146             u++,v++;
147             e[i]={u,v};
148             add(u,v);
149             add(v,u);
150         }
151         for(int i=1;i<=n;++i)
152             if(!dfn[i])
153                 Tarjan(i,-1);
154         if(sccn==1)
155         {
156             pr("impossible\n");
157             continue;
158         }
159         ans=2e9;
160         mem(head,0);
161         tot=0;
162         mem(edge,0);
163         for(int i=1;i<=m;++i)
164         {
165             if(color[e[i].u]==color[e[i].v])continue;
166             add(color[e[i].u],color[e[i].v]);
167             add(color[e[i].v],color[e[i].u]);
168         }
169         mem(vis,0);
170         dfs(1,0);
171         pr("%d\n",ans);
172     }
173     return 0;
174 }
175
176 /**************************************************************************************/

原文地址:https://www.cnblogs.com/--HPY-7m/p/11813992.html

时间: 2024-08-29 03:07:43

考研路茫茫——空调教室HDU2242(Tarjan缩点)的相关文章

hdoj 2242 考研路茫茫——空调教室 【无向图求边双联通 缩点 + 树形dp】

考研路茫茫--空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2447    Accepted Submission(s): 721 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY

HDU 2242 考研路茫茫——空调教室 无向图缩环+树形DP

考研路茫茫——空调教室 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY. 一个炎热的下午,Lele照例在教室睡觉的时候,竟然做起了空调教室的美梦. Lele梦到学校某天终于大发慈悲给某个教室安上了一个空调.而且建造了了M条通气管道,让整个教学楼的全部教室都直接或间接和空调教室连通上,构成了教室群,于是,全部教室都能吹到空调了. 不仅仅这样,学校发现教

HDU 2242 考研路茫茫——空调教室(边双连通)

HDU 2242 考研路茫茫--空调教室 题目链接 思路:求边双连通分量,然后进行缩点,点权为双连通分支的点权之和,缩点完变成一棵树,然后在树上dfs一遍就能得出答案 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <vector> using namespace std; const int N = 10005;

hdu 2242 考研路茫茫――空调教室 (双连通入门题)

1 /********************************************************** 2 题目: 考研路茫茫——空调教室(hdu 2242) 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=2242 4 算法: 双联通 5 思路: 找到桥,然后计算桥两边的差,在把桥一边 6 的值压缩到和另一边相邻的数上. 7 8 *************************************************

HDU 2242 考研路茫茫----空调教室

传送门 考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2445    Accepted Submission(s): 720 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无

hdu2422考研路茫茫——空调教室 tarjan+树形dp

//给一个无向图,其每个顶点都有权值,求去掉一条边,将这个图分为两部分 //问这两部分的所有顶点和的绝对值的最小值 //用tarjan缩点 , 缩点后为一棵树 //然后用树形dp求出其最小的绝对值 // ans = min(ans , (int)(abs((double)(sum - 2*dp[v])))) ; //其中dp[u] 表示以u点为根节点的子树的学生数 #include<cstdio> #include<cstring> #include<iostream>

HDU - 2242 考研路茫茫――空调教室(树形DP+强连通分量)

题目大意:众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY. 一个炎热的下午,Lele照例在教室睡觉的时候,竟然做起了空调教室的美梦. Lele梦到学校某天终于大发慈悲给某个教室安上了一个空调.而且建造了了M条通气管道,让整个教学楼的全部教室都直接或间接和空调教室连通上,构成了教室群,于是,全部教室都能吹到空调了. 不仅仅这样,学校发现教室人数越来越多,单单一个空调已经不能满足大家的需求.于

HDU 2242 考研路茫茫——空调教室 (双连通分量+树形DP)

题目地址:HDU 2242 先用双连通分量缩点,然后形成一棵树,然后在树上做树形DP,求出每个点的子树和.然后找最小值即可.需要注意一下重边的问题,第一次返回父节点时可以忽略,因为这是反向边,然后之后再返回的时候就不是反向边了.不能忽略了. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #i

HDU 2242 双连通分量 考研路茫茫——空调教室

思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <stack> 6 using namespace std; 7 8 const int maxn = 10000 + 10; 9 const int