用spfa
#include<iostream>//spfa
#include<stack> //用队列超时 用栈600ms+
using namespace std;
#define inf 0x1fffffff
int dist[30010],visited[30010],adj[30010],size;
int nodenum,edgenum;
struct node
{
int e,w,next;
}head[1500000];
void add(int s,int e,int w)
{
head[size].e = e;
head[size].w = w;
head[size].next = adj[s];
adj[s] = size++;
}
void spfa()
{
int i;
for(i = 0;i <= nodenum;i++)
dist[i] = inf;
dist[1] = 0;
stack<int> sta;
sta.push(1);
visited[1] = 1;
int u,v,w;
while(!sta.empty())
{
u = sta.top();
sta.pop();
visited[u] = 0;
for(i = adj[u];i != -1;i = head[i].next)
{
v = head[i].e;
w = head[i].w;
if(dist[v] > dist[u] + w)
{
dist[v] = dist[u] + w;
if(!visited[v])
{
visited[v] = 1;
sta.push(v);
}
}
}
}
}
int main()
{
scanf("%d%d",&nodenum,&edgenum);
int i,a,b,c;
size = 0;
memset(adj,-1,sizeof(adj));
for(i = 0;i < edgenum;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
spfa();
printf("%d\n",dist[nodenum]);
return 0;
}
用dijkstra + 优先队列
#include<iostream> //dijkstra 1400ms+
#include<queue>
using namespace std;
#define inf 0x1fffffff
int nodenum,edgenum;
int dist[30010],adj[30010],size;
struct node
{
int e,w,next;
}head[150010];
struct edge
{
int k,w;
bool operator < (edge a) const
{
return w > a.w;
}
};
void add(int s,int e,int w)
{
head[size].e = e;
head[size].w = w;
head[size].next = adj[s];
adj[s] = size++;
}
void dijkstra()
{
int i;
for(i = 0;i <= nodenum;i++)
dist[i] = inf;
dist[1] = 0;
priority_queue<edge> que;
edge cur;
cur.k = 1;cur.w = 0;
que.push(cur);
while(!que.empty())
{
cur = que.top();
que.pop();
for(i = adj[cur.k];i != -1;i = head[i].next)
{
if(dist[head[i].e] > dist[cur.k] + head[i].w)
{
dist[head[i].e] = dist[cur.k] + head[i].w;
edge tmp;
tmp.k = head[i].e;
tmp.w = head[i].w;
que.push(tmp);
}
}
}
}
int main()
{
scanf("%d%d",&nodenum,&edgenum);
int i,a,b,c;
size = 0;
memset(adj,-1,sizeof(adj));
for(i = 0;i < edgenum;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
dijkstra();
printf("%d\n",dist[nodenum]);
return 0;
}