| ||||||||||
| 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+堆优化 附代码代码比较乱更新rank【i】为结点的离他距离最近的rank>j的节点的距离
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
using namespace std;
struct ff
{
int nx,y,d;
} e[300010];
int dist[30010],rank[30010],Head[30010],TopR;
int B[12][30010];
struct xgd
{
int y;
bool operator < (const xgd &b) const
{
return dist[y]>dist[b.y];
}
} tmp,now;
priority_queue<xgd>q;
int n,m,tot=0;
bool vis[30010];
inline void Add(int a,int b,int c)
{
tot++;
e[tot].y=b;
e[tot].d=c;
e[tot].nx=Head[a];
Head[a]=tot;
tot++;
e[tot].y=a;
e[tot].d=c;
e[tot].nx=Head[b];
Head[b]=tot;
}
void csh()
{
int l,r,y;
for(int i=1; i<=9; i++)
for(int j=1; j<=9; j++) B[i][j]=100000000;
for(int i=1; i<=9; i++)
{
l=1;
r=0;
memset(vis,0,sizeof(vis));
while(!q.empty()) q.pop();
for(int j=1; j<=n; j++) dist[j]=100000000;
for(int j=1; j<=n; j++)
if(rank[j]>i)
{
tmp.y=j;
q.push(tmp);
r++;
dist[j]=0;
}
while(l<=r)
{
now=q.top();
q.pop();
B[i][now.y]=dist[now.y];
for(int k=Head[now.y]; k; k=e[k].nx)
{
y=dist[now.y]+e[k].d;
if(y<dist[e[k].y])
{
dist[e[k].y]=y;
if(!vis[e[k].y])
{
tmp.y=e[k].y;
q.push(tmp);
r++;
vis[e[k].y]=1;
}
}
}
l++;
}
}
}
int Dij(int v)
{
int halo,res,y;
if (rank[v]==TopR) return n;
int l=1,r=1;
res=0;
halo=rank[v];
memset(vis,0,sizeof(vis));
while(!q.empty()) q.pop();
for(int j=1;j<=n;j++) dist[j]=100000000;
tmp.y=v;
dist[v]=0;
q.push(tmp);
vis[v]=1;
rank[v]=0;
while(l<=r)
{
now=q.top();
q.pop();
if(dist[now.y]<B[halo][now.y])
{
res++;
for(int i=Head[now.y];i;i=e[i].nx)
{
y=dist[now.y]+e[i].d;
if (y<dist[e[i].y])
{
dist[e[i].y]=y;
if (!vis[e[i].y])
{
tmp.y=e[i].y;
q.push(tmp);
r++;
vis[e[i].y]=1;
}
}
}
}
l++;
}
return res;
}
int main()
{
// freopen("servers.in","r",stdin);
// freopen("servers.out","w",stdout);
scanf("%d%d",&n,&m);
TopR=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&rank[i]);
if(rank[i]>TopR) TopR=rank[i];
}
int x,y,p;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&p);
Add(x,y,p);
}
csh();
int ans=0;
for(int i=1; i<=n; i++) ans+=Dij(i);
printf("%d\n",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator