| ||||||||||
| 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 | |||||||||
为什么Dij+heap还TLE呢?貌似这种情况很多。麻烦哪位大牛看看:
#include<iostream>
#define MAX 50001
#define MAXNUMBER 9223372036854775807
using namespace std;
__int64 dist[MAX];
unsigned long weights[MAX];
struct node
{
int w;
unsigned long value;
node* next;
}*graph[MAX];
int numberofnodes,numberofedges;
int array[MAX];
int currentsize;
void insert(int x)
{
array[++currentsize]=x;
int hole=currentsize;
for(;hole/2>0 && dist[hole/2]>dist[hole];hole/=2)
array[hole]=array[hole/2];
array[hole]=x;
}
void percolatedown(int hole)
{
int child=hole;
int temp=array[hole];
for(child=hole;child*2<=currentsize;hole=child)
{
child=hole*2;
if(child+1<=currentsize && dist[child+1]<dist[child])
child++;
if(dist[child]<temp)
array[hole]=array[child];
else
break;
}
array[hole]=temp;
}
int delmin()
{
int temp=array[1];
array[1]=array[currentsize--];
percolatedown(1);
return temp;
}
void inti()
{
memset(graph,NULL,sizeof(graph));
for(int i=0;i!=MAX;++i)
dist[i]=MAXNUMBER;
memset(weights,0,sizeof(weights));
numberofnodes=numberofedges=0;
currentsize=0;
}
void put(int x,int y,unsigned long value)
{
node* temp=graph[x];
graph[x]=new node;
graph[x]->w =y;
graph[x]->value =value;
graph[x]->next =temp;
}
void release()
{
for(int i=0;i!=MAX;++i)
{
node* temp=graph[i],* tt;
while(temp!=NULL)
{
tt=temp->next;
delete temp;
temp=tt;
}
}
}
void find(int s)
{
int v,w;
node* link;
dist[s]=0;
insert(s);
while(currentsize!=0)
{
v=delmin();
if(dist[v]!=MAXNUMBER)
for(link=graph[v];link!=NULL;link=link->next )
if(dist[v]+link->value <dist[w=link->w])
{
dist[w]=dist[v]+link->value ;
insert(w);
}
}
}
bool check()
{
for(int i=1;i<=numberofnodes;++i)
if(graph[i]==NULL)
return false;
return true;
}
int main()
{
int cases;
cin>>cases;
while(cases--)
{
inti();
scanf("%d %d",&numberofnodes,&numberofedges);
int i;
for(i=1;i<=numberofnodes;++i)
scanf("%d",&weights[i]);
int x,y;
unsigned long value;
for(i=1;i<=numberofedges;++i)
{
scanf("%d %d %d",&x,&y,&value);
put(x,y,value);
put(y,x,value);
}
if(check() && numberofnodes!=0)
{
find(1);
__int64 price=0;
for(i=1;i<=numberofnodes;++i)
price+=dist[i]*weights[i];
printf("%I64d",price);
}
else
cout<<"No Answer";
release();
cout<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator