题目描述
城市总共有N座。yintama是右京女神的狂热粉,当他得知右京女神将要在城市N举办演唱会的时候,马上开始准备动身前往城市N。原本他可以直接乘飞机直达城市N,然而贫穷使他屈服,他必须选择总花费最少的那条路径。设总共有N座城市(2<=N<=1000),城市编号分别为1,2,3......N。M条航线(1<=M<=2000),每条航线连接两座城市,相互可以到达(无向的)。yintama目前在身在城市1,求最后yintama参加右京女神演唱会所需要的最少花费。(PS:重边考虑一下?)
输入
有多组输入。
第一行输入一个N、M,代表城市的总数,以及航线的总数。
接下来M行,每行输入三个数字u v w,代表城市u、v之间存在航线,机票花费为w。
输出
每行输出一个数,代表yintama参加右京女神演唱会所需的最少花费。
样例输入
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
样例输出
90
提示
#include<iostream> #include<cstring> using namespace std; #define maxx 0x3f3f3f3f int m[1001][1001]; int process[1001][1001]; int tag[1001]; int N; int M; int get_min_index(int line) { int vexnum=N; int index=0; for(int i=0;i<vexnum;i++) { if(tag[i]==0&&process[i][line]<process[index][line]) index=i; } return index; } void Set_Min_Path_Djs(int n,int start) { int vexnum=n; for(int i=0;i<vexnum;i++) { for(int j=0;j<vexnum;j++) { process[i][j]=maxx; } } memset(tag,0,sizeof(tag)); tag[start]=1; for(int j=0;j<vexnum;j++) { if(tag[j]==0) { process[j][0]=m[start][j]; } } int vmin=get_min_index(0); tag[vmin]=1; for(int i=1;i<vexnum;i++) { for(int j=0;j<vexnum;j++) { process[j][i]=process[j][i-1]; } for(int j=0;j<vexnum;j++) { if(tag[j]==0&&m[start][vmin]+m[vmin][j]<m[start][j]) { process[j][i]=m[start][vmin]+m[vmin][j]; m[start][j]=m[start][vmin]+m[vmin][j]; } } vmin=get_min_index(i); tag[vmin]=1; } /*for(int i=0;i<vexnum;i++) { for(int j=0;j<vexnum-1;j++) { if(process[i][j]==maxx) cout<<"∞ "; else cout<<process[i][j]<<" "; } cout<<endl; }*/ cout<<process[vexnum-1][vexnum-2]<<endl; } int main() { while(cin>>N>>M) { int x,y,num; memset(m,0,sizeof(m)); for(int count=0;count<M;count++) { cin>>x>>y>>num; x--; y--; if(m[x][y]==0&&m[y][x]==0) { m[x][y]=num; m[y][x]=num; } else { int now=m[x][y]; if(now>num) { m[x][y]=num; m[y][x]=num; } } } for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { if(m[i][j]==0) m[i][j]=maxx; } } Set_Min_Path_Djs(N,0); } return 0; }