예제 #1
0
파일: 1561.cpp 프로젝트: edisonhello/cpp
int dijdij(int st,int ed){
    v[0].reset(); v[1].reset();
    for(int i=0;i<111;++i)d[i].clear();
    d[st].pb(0);
    PQ<pii,vector<pii>,greater<pii>> pq; pq.push({0,st});
    while(pq.size()){
        while(pq.size() && v[1][pq.top().Y])pq.pop();
        if(pq.empty())break;
        pii now=pq.top(); pq.pop();
        int stp=v[0][now.Y]?1:0;
        PDE3(now,stp,pq);
        v[stp][now.Y]=1;
        for(pii e:G[now.Y]){
            d[e.X].pb(now.X+e.Y);
            sort(d[e.X].begin(),d[e.X].end());
            d[e.X].resize(unique(d[e.X].begin(),d[e.X].end())-d[e.X].begin());
            if(d[e.X].size()>2u){
                sort(d[e.X].begin(),d[e.X].end());
                d[e.X].pop_back();
            }
            if(now.X+e.Y<=d[e.X].back()){
                pq.push({now.X+e.Y,e.X});
            }
        }
    }
    if(d[ed].size()<2u)return -1;
    else return d[ed][1];
}
예제 #2
0
void  testHeap ( int n ) {
   T* A = new T[2*n/3]; //创建容量为2*n/3的数组,并
   for ( int i = 0; i < 2 * n / 3; i++ ) A[i] = dice ( ( T ) 3 * n ); //在其中随机生成2*n/3个词条
   /*DSA*/printf ( "%d random keys created:\n", 2 * n / 3 );
   /*DSA*/for ( int i = 0; i < 2 * n / 3; i++ ) print ( A[i] ); printf ( "\n" );
   PQ heap ( A + n / 6, n / 3 ); //批量建堆(PQ_ComplHeap实现了Robert Floyd算法)
   delete [] A;
   /*DSA*/system("cls"); print ( heap );  Sleep(100);
   while ( heap.size() < n ) { //随机测试
      if ( dice ( 100 ) < 70 ) { //70%概率插入新词条
         T e = dice ( ( T ) 3 * n ); /*DSA*/printf ( "Inserting" ); print ( e ); printf ( " ...\n" );
         heap.insert ( e ); /*DSA*/printf ( "Insertion done\n" );
      } else { //30%概率摘除最大词条
         if ( !heap.empty() ) {
            /*DSA*/printf ( "Deleting max ...\n" );
            T e = heap.delMax();/*DSA*/printf ( "Deletion done with" ); print ( e ); printf ( "\n" );
         }
      }
      /*DSA*/system("cls"); print ( heap ); Sleep(100);
   }
   while ( !heap.empty() ) { //清空
      T e = heap.delMax();/*DSA*/printf ( "Deletion done with" ); print ( e ); printf ( "\n" );
      /*DSA*/system("cls"); print ( heap ); Sleep(100);
   }
}
예제 #3
0
파일: 1445.cpp 프로젝트: edisonhello/cpp
int main(){
    int n,m; cin>>n>>m;
    while(m--){
        int u,v; ll c; cin>>u>>v>>c;
        pq.push({c,pii(u,v)});
        E.eb(c,pii(u,v));
    }
    djs.init(1006);
    int pointsssss=1;
    ll firstttttt=0;
    while(pq.size()){
        if(!djs.C(pq.top().Y.X,pq.top().Y.Y)){
            G[pq.top().Y.X].eb(pq.top().Y.Y,pq.top().X);
            G[pq.top().Y.Y].eb(pq.top().Y.X,pq.top().X);
            ++pointsssss;
            firstttttt+=pq.top().X;
            djs.U(pq.top().Y.X,pq.top().Y.Y);
        } pq.pop();
    } if(pointsssss<n)return cout<<"-1 -1"<<endl,0;
    if(E.size()==n-1)return cout<<firstttttt<<" -1"<<endl,0;
    dfs(1,1,1);
    PDE1(firstttttt);
    ll diffffffff=1000000000000000000ll;
    for(auto i:E){
        if(p[0][i.Y.X]==i.Y.Y || p[0][i.Y.Y]==i.Y.X)continue;
        PDE1(i);
        diffffffff=min(diffffffff,i.X-lca(i.Y.X,i.Y.Y));
    } cout<<firstttttt<<" "<<firstttttt+diffffffff<<endl;
}
예제 #4
0
// find top-k CC using boost graph representation
PQ find_top_CC(DeterministicGraph& PW, int k) {
	typename graph_traits <DeterministicGraph>::out_edge_iterator out1, out2;

	PQ pq; // priority queue for top-k CC
	int V = num_vertices(PW);
	bool *explored = new bool[V+1];
	for (int i = 0; i < V; ++i)
		explored[i] = false;
	int cc_number = 0;
	int unit_sized = 0;

	for (int i = 0; i < V; ++i) {
		if (!explored[i]) {
			// perform BFS for vertex i
			vector<int> CC;
			CC.push_back(i);
			explored[i] = true;
			vector<int>::size_type ix = 0;
			while (ix < CC.size()) {
				Vertex u = vertex(CC[ix], PW);
				for (tie(out1, out2) = out_edges(u, PW); out1 != out2; ++out1) {
					Vertex v = target(*out1, PW);
					if (!explored[v]) {
						CC.push_back(v);
						explored[v] = true;
					}
				}
				ix++;
			}
//			if (CC.size() > 5)
//				cout << cc_number << ": " << CC.size() << endl;
			if (CC.size() == 1) {
				unit_sized++;
			}
			cc_number++;

			// maintain CC priority queue
			int pq_size = pq.size();
			if (pq_size == k) {
				vector<int> top = pq.top();
				if (top.size() < CC.size()) {
					pq.pop();
					pq.push(CC);
				}
			}
			else
				pq.push(CC);
		}
	}
//	cout << "Total CCs: " << cc_number << endl;
//	cout << "Unit CCs: " << unit_sized << endl;
	return pq;
}
예제 #5
0
// find top-k CCs using vectors graph representation
PQ find_top_CC2(vector<vector<int> >& PW, int V, int k) {

	PQ pq; // priority queue for top-k CC
	map<int, bool> explored;
	for (int i = 0; i < V; ++i)
		explored[i] = false;
	int cc_number = 0;
	int unit_sized = 0;

	for (int i = 0; i < V; ++i) {
		if (!explored[i]) {
			// perform BFS for vertex i
			vector<int> CC;
			CC.push_back(i);
			explored[i] = true;
			vector<int>::size_type ix = 0;
			while (ix < CC.size()) {
				int pw_size = PW[CC[ix]].size();
				for (int j = 0; j < pw_size; ++j) {
					int v = PW[CC[ix]][j];
					if (!explored[v]) {
						CC.push_back(v);
						explored[v] = true;
					}
				}
				ix++;
			}
//			if (CC.size() > 5)
//				cout << cc_number << ": " << CC.size() << endl;
			if (CC.size() == 1) {
				unit_sized++;
			}
			cc_number++;

			// maintain CC priority queue
			int pq_size = pq.size();
			if (pq_size == k) {
				vector<int> top = pq.top();
				if (top.size() < CC.size()) {
					pq.pop();
					pq.push(CC);
				}
			}
			else
				pq.push(CC);
		}
	}
//	cout << "Total CCs: " << cc_number << endl;
//	cout << "Unit CCs: " << unit_sized << endl;
	return pq;
}
예제 #6
0
파일: 318.cpp 프로젝트: edisonhello/cpp
int main(){
    // freopen("in","r",stdin);
    // freopen("out","w",stdout);
    int ks=0,n,m;while(rit(n,m),n){
        while(m--){
            int a,b,l;rit(a,b,l);
            G[a].pb({b,l}); G[b].pb({a,l});
        }
        pq.push({1,0});
        while(pq.size()){
            while(v[pq.top().X])pq.pop();
            v[pq.top().X]=1;
            
        }
    }
}
예제 #7
0
파일: qknn.hpp 프로젝트: Allefah/CMVS-PMVS
 /*! 
   Returns the current size of the queue 
   \return Size
 */  
 int size(){ return pq.size(); }