最短路径(迪杰斯特拉算法)

题目描述
有n座城市,编号从1到n
m条路,每条路都是单行的,即有一条从1到2的路,那么你可以从1到达2,但不能从2到达1
每条路都有一定的距离
给你起点和终点,求最短距离
可能包含重边,也就是说从A到B可能会有多条长度不同路

输入格式
第一行两个整数n和m
第二行两个整数s和t,表示起点和终点
接下来又m行,每行三个整数ui,vi,wi,表示有一条从城市ui到达vi的路,长度为wi

输出格式
输s到t的最短距离
如果不存在请输出todokanaikoi

样例输入
3 3
1 2
1 3 1
3 1 2
3 2 5

样例输出
6

提示
1<=n<=1000
1<=m<=n*n
1<=wi<=1000

#include
#include
#include 
using namespace std;
struct edge{
     
	int y,w;
	edge(int yy=0,int ww=0){
     
		y=yy;
		w=ww; 
	} 
};
const int MAX=1010;
vector<edge> g[MAX];
bool vis[MAX];
int dis[MAX]; 

int main(){
     
	int n,m,st,ed;
	cin>>n>>m>>st>>ed;
	for(int i=1;i<=m;i++){
     
		int x,y,w;
		cin>>x>>y>>w;
		g[x].push_back(edge(y,w)); 
	} 
	
	//dijkstra(); 
	memset(vis,false,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	dis[st]=0;
	for(int i=1;i<=n;i++){
     
		int id=0;
		for(int j=1;j<=n;j++)
			if(vis[j]==false&&dis[j]<dis[id])
				id=j;
		if(id==0)
			break;
		vis[id]=true;
		for(int j=0;j<g[id].size();j++){
     
			int y=g[id][j].y;
			int w=g[id][j].w;
			if(dis[y]>dis[id]+w)
				dis[y]=dis[id]+w; 
		} 
	} 
	
	if(vis[ed]==true)
		cout<<dis[ed]<<endl;
	else
		cout<<"todokanaikoi"<<endl;
	return 0; 
}

你可能感兴趣的:(ACM竞赛习题)