N个点,T条双向边,输入:
点u编号 点v编号 距离
定义带权图
//定义边
struct edge
{
int to,dist;
};
vector< edge > G[maxn];//每个G[i]存放的是定点编号为i的点相邻的边
添加边
void add_edge(int u,int v,int dist)
{
edge e;
e.to=v;
e.dist=dist;
G[u].push_back(e);
}
//如果是双向边(无向图)
add_edge(u,v,dist);
add_edge(v,u,dist);
##优先队列##
定义
typedef pair< int,int > P
priority_queue<P,vector<P>,greater<P> > que;
#include< queue >
typedef pair < int,int > P;//第一维是距离,第二维是点的编号,优先队列先按照第一维大小弹出结点
int d[maxn];//存放的是起始点到各点的最短路径长度
void dijkstra(int s)//s是起始点的编号
{
priority_queue< P,vector< P >,greater< P > 这里有一个空格> que;
//初始化,一开始所有所有点最短路径长度都是无穷大
for(int i=0;i<=G[s].size();i++)
{
d[i]=INF;
}
d[s]=0;
que.push(P(0,s));
//一直找出目前没有确定最短路径的点中,距离起始点最近的一个点
while(!que.empty())
{
P p=que.top();que.pop();
int v=p.second;
//更新所有这个点连到的点的最短路径
for(int i=0;i<G[v].size();i++)
{
egde e=G[v][i];
int g=e.to;
if(d[g]>d[v]+e.dist)
{
d[g]=d[v]+e.dist;
que.push(P(d[g],g));
}
}//for
}//while
}//dijkstra
完整的代码:
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define maxn 1010
#define INF 210000
struct edge
{
int to,dist;
};
vector<edge> G[maxn];
int d[1010];//每个点到起始点的最短距离
int n;
void add_edge(int u,int v,int dist)
{
edge e;
e.to=v;
e.dist=dist;
G[u].push_back(e);
}
typedef pair<int,int> P;//第一维是距离,第二维是起始点编号
//优先队列先按照第一维大小弹出结点
void dijkstra(int s)
{
priority_queue<P,vector<P>, greater<P> > que;//定义优先队列
for(int i=1;i<=n;i++)
{
d[i]=INF;
}
d[s]=0;
que.push(P(0,s));
while(!que.empty())
{
P p=que.top();que.pop();
int v=p.second;
if(d[v]<p.first) continue;
for(int i=0;i<G[v].size();i++)//找出所有和v相邻的边
{
edge e=G[v][i];
if(d[e.to]>d[v]+e.dist)
{
d[e.to]=d[v]+e.dist;
que.push(P(d[e.to],e.to));
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
int t;
scanf("%d%d",&n,&t);
while(t)
{
int v,u,cost;
scanf("%d%d%d",&u,&v,&cost);
add_edge(u,v,cost);
add_edge(v,u,cost);
t--;
}
dijkstra(n);
printf("%d",d[1]);
return 0;
}