Test instructions
N (2<n<100) schools have a one-way network, each school gets a set of software, can be transmitted through a one-way network to the surrounding schools, question 1: At least the initial number of schools need to distribute software, so that all schools in the network will eventually get the software. 2, at least a few transmission lines (edges) need to be added, so that after any software release to a school, after several transfers, all the schools in the network will eventually get the software.
Ideas:
We can first make the Dag map, then we consider the first problem, the minimum number of sets of software can be fully covered, first test instructions has been guaranteed to be connected. Then we can think that if we put all the points that are not in the edge of the software, it will be feasible. There is bound to be a certain edge through some side eventually from the distribution software must have out of the place to obtain software. Then we consider the second question: This is a connected graph, if we have some points not in the point, some points are not out point, then if we find a way to connect the point and some out point, we can guarantee that the end will be a lot of circle connected. The answer is the maximum value of the point without the edge and the point without the edge.
Code:
#include <iostream>#include<cstdio>#include<algorithm>#include<stack>using namespaceStd;stack<int>DL;Const intMAXN =150000;intHEAD[MAXN],TO[MAXN],NXT[MAXN],DFN[MAXN],LOW[MAXN],INS[MAXN],SG[MAXN];intOUD[MAXN],IND[MAXN];intCnt,n,a,tot,tjs;voidAD_EDG (intXinty) {nxt[++TJS] =Head[x]; HEAD[X]=TJs; To[tjs]=y;}voidsread () {cin>>N; for(inti =1; I <= n;i++) { while(1) {cin>>A; if(!a) Break; AD_EDG (I,a); } }}voidTarjan (intX//Tarjan Algorithm{dfn[x]= Low[x] = + +CNT; Dl.push (x), ins[x]=1; for(inti = Head[x];i;i =Nxt[i]) { if(!Dfn[to[i]]) {Tarjan (to[i]); LOW[X]=min (Low[x],low[to[i]]); }Else if(Ins[to[i]]) low[x]=min (Low[x],dfn[to[i]]); } if(Low[x] = =Dfn[x]) {Sg[x]= ++tot; while(Dl.top ()! = x) ins[dl.top ()] =0, Sg[dl.top ()] =Tot,dl.pop (); INS[X]=0, Dl.pop (); }}voidswork () { for(inti =1; I <= n;i++) if(!Dfn[i]) Tarjan (i); for(inti =1; I <= n;i++) for(intj = Head[i];j;j =Nxt[j])if(Sg[i]! =Sg[to[j]]) Oud[sg[i]++,ind[sg[to[j]]]++; intT1 =0, t2 =0; for(inti =1; I <= tot;i++) { if(!ind[i]) t1++; if(!oud[i]) t2++; } if(Tot = =1) cout<<"1"<<endl<<"0"<<Endl; Elsecout<<t1<<endl<<max (T2,T1) <<Endl;}intMain () {sread (); Swork (); return 0;}
View Code
POJ1236 Network of schools "strong connectivity"