| ||||||||||
| 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:TLEIn Reply To:晕 dij+heap都TLE Posted by:cycpp at 2009-06-05 18:59:57 #include <iostream>
#include <algorithm>
#include <list>
using namespace std;
struct node
{
int v,weight;
};
#define INT_MAX 10000000
#define N 30005
list < node > adj[N];//邻接表,点从1开始计数
list < node > :: iterator ite;
int heap[N],heapindex[N],visited[N],dis[N];
void makeheap1(int change)//最小堆,change处变小,向上调整
{
int parent;
while(change!=1)
{
parent=change/2;
if(dis[heap[parent]]>dis[heap[change]])
{
// swap(heapindex[heap[parent]],heapindex[heap[change]]);
swap(heap[parent],heap[change]);
heapindex[heap[parent]]=parent;
heapindex[heap[change]]=change;
change=parent;
}
else break;
}
}
void makeheap2(int n)//1--n的最小堆,堆顶元素的调整
{
int parent,lson,rson,pw,lw,rw;
parent=1;
lson=parent*2;
rson=parent*2+1;
while(lson>n)//没有孩子了
{
pw=dis[heap[parent]];
lw=dis[heap[lson]];
rw=dis[heap[rson]];
if(rson>n)rw=INT_MAX;
if(pw<=lw&&pw<=rw)return;
if(lw<rw)
{//左交换
// swap(heapindex[heap[parent]],heapindex[heap[lson]]);
swap(heap[parent],heap[lson]);
heapindex[heap[parent]]=parent;
heapindex[heap[lson]]=lson;
parent=lson;
}
else
{
// swap(heapindex[heap[parent]],heapindex[heap[rson]]);
swap(heap[parent],heap[rson]);
heapindex[heap[parent]]=parent;
heapindex[heap[rson]]=rson;
parent=rson;
}
lson=parent*2;
rson=parent*2+1;
}
}
void dijkstra(int s,int n)
{
int i,pose,v,w;
for(i=1;i<=n;++i){heap[i]=i;heapindex[i]=i;}
fill(dis,dis+n+1,INT_MAX);
memset(visited,0,sizeof(visited));
dis[s]=0;
makeheap1(heapindex[s]);
for(i=1;i<=n;++i)
{
pose=heap[1];
if(dis[pose]==INT_MAX)return;
if(pose==n)return;
visited[pose]=true;
heap[1]=heap[n-i+1];//在还有n-i+1个元素的堆中删除第一个元素
heapindex[heap[1]]=1;
makeheap2(n-i);//调整还有n-i个元素堆
for(ite=adj[pose].begin();ite!=adj[pose].end();++ite)
{
v=ite->v;
w=ite->weight;
if(!visited[v]&&dis[pose]+w<dis[v])
{
dis[v]=dis[pose]+w;
makeheap1(heapindex[v]);
}
}
}
}
int main()
{
int s,t,w,n,m;
node temp;
cin>>n>>m;
while(m--)
{
scanf("%d%d%d",&s,&t,&w);
temp.v=t;
temp.weight=w;
adj[s].push_back(temp);
}
dijkstra(1,n);
cout<<dis[n]<<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