您的位置:首页 > 其它

[kuangbin带你飞]专题四 最短路练习 K POJ 3159

2016-10-12 21:20 218 查看
题目地址:https://vjudge.net/contest/66569#problem/K

思路:思路总是很简单的最短路……然而这道题数据也太猛了。一开始老规矩vector+spfa,TLe成傻逼。改为手写邻接表+spfa,TLe成傻逼。再改为手写邻接表+dij+优先队列,Tle成傻逼,最后加了输入外挂,勉强1300ms卡了进去。看到有人47ms过了这题……Orz……

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=150000+10;
struct pos{
int u,v,w,next;
}E[maxn];
int head[30000+5];
int k;
int d[30000+5];
int n,m;

template <typename T>
inline void read(T& x)
{
char ch;
while (!((((ch=getchar())>='0') && (ch <= '9')) || (ch == '-')));
x = ch-'0';
while (((ch=getchar())>='0') && (ch <= '9')) x = x*10+ch-'0';
}

void addedge(int u,int v,int w)
{
E[++k].u=u;
E[k].v=v;
E[k].w=w;
E[k].next=head[u];
head[u]=k;

}

void dij(int s)
{
priority_queue<pair<int,int> >q;
d[s]=0;
q.push(make_pair(-d[s],s));
while(!q.empty())
{
int now=q.top().second;
q.pop();
for(int i=head[now];i!=-1;i=E[i].next)
{
int v=E[i].v;
if(d[v]>d[now]+E[i].w)
{
d[v]=d[now]+E[i].w;
q.push(make_pair(-d[v],v));
}
}
}
}

int main()
{
read(n);
read(m);
for(int i=0;i<=n;i++)
d[i]=INF;
memset(head,-1,sizeof(head));
k=0;
for(int i=0;i<m;i++)
{
int a,b,c;
read(a),read(b),read(c);
addedge(a,b,c);
}
dij(1);
printf("%d\n",d
);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: