| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:Prim超时果真是scanf+getchar,换成cin就可以了In Reply To:Prim超时果真是scanf+getchar,换成cin就可以了 Posted by:wyylling at 2009-10-11 17:05:08 > g++是0Ms,C++ 16MS
>
> #include<cstdio>
> #include<iostream>
> #include<string>
> #include<algorithm>
> #include<vector>
> #include<numeric>
> #include<cmath>
> #include<bitset>
> #include<set>
> #include<queue>
>
> using namespace std;
>
> int w[30][30];
>
> typedef struct Node
> {
> int sequenceNumber;
> int weight;
> };
>
> bool cmp(Node* n1,Node* n2)
> {
> if(n1->weight <= n2->weight)
> return false;
> else
> return true;
> }
>
> long long prim(int n)
> {
> long long min_len =0;
> int u,v,i,j;
> bitset<101> bit;//判断节点是否还在队列中
> vector<Node*> Prqueue;//优先级队列
> Node* node = new Node();
> node->sequenceNumber = 0;
> node->weight = 0;
> Prqueue.push_back(node);
> for(i = 1; i < n; ++i)
> {
> Node* node = new Node();
> node->sequenceNumber = i;
> node->weight = 400000000;
> Prqueue.push_back(node);
> }
>
> Node* tmp;
> while(!Prqueue.empty())
> {
> tmp = Prqueue.front();
> min_len += tmp->weight;
> Prqueue.erase(Prqueue.begin());
> u = tmp->sequenceNumber;
> bit.set(u);
> for(i = 0; i < n; ++i)
> {
> if(w[u][i] != 0) //节点u的所有邻接节点
> {
> v = i;
> if( !bit.test(v)) //&& w[u][v] <
> {
> //for(j = 1; i < Prqueue.size(); ++j)
> j = 0;
> while(j < Prqueue.size())
> {
> if(Prqueue[j]->sequenceNumber == v && w[u][v] < Prqueue[j]->weight)
> {
> Prqueue[j]->weight = w[u][v];
> break;
> }
> ++j;
> }
> }
> }
> }
> make_heap(Prqueue.begin(),Prqueue.end(),cmp);
> }
> return min_len;
> }
>
> int main(int argc, char* argv[])
> {
> int n,i,j,num,x,y,dist;
> char base,other;
> int tmp;
> while(true)
> {
> scanf("%d",&n);
> if(n == 0)
> break;
> tmp = n;
> //getchar();
> cin.get();
> while(n > 1)
> {
> //scanf("%c %d",&base,&num);
> //getchar();
> cin>>base>>num;
> for(i = 0; i < num; ++i)
> {
> //scanf("%c %d",&other,&dist);
> cin>>other>>dist;
> //getchar();
> x = abs(base - 'A');
> y = abs(other - 'A');
> w[x][y] = w[y][x] = dist;
> }
> --n;
> }
> cout<<prim(tmp)<<endl;
> for(i = 0; i <= 28; ++i)
> for(j = 0; j <= 28; ++j)
> w[i][j] = 0;
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator