考研路茫茫——空调教室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 /**************************************************************************************/

 

posted @ 2019-11-07 18:06  ZMWLxh  阅读(207)  评论(0编辑  收藏  举报