题目链接:http://poj.org/problem?id=2387
题目大意:给你t条边(无向图),n个顶点,让你求点1到点n的最短距离。
解题思路:裸的dijsktra,注意判重边。
代码:
1 #include<cstdio> 2 #include<cmath> 3 #include<cctype> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #include<set> 10 #include<map> 11 #include<stack> 12 #include<string> 13 #define LC(a) (a<<1) 14 #define RC(a) (a<<1|1) 15 #define MID(a,b) ((a+b)>>1) 16 using namespace std; 17 typedef long long LL; 18 const int INF=0x3f3f3f3f; 19 const int N=1e3+5; 20 21 int dis[N],cost[N][N]; 22 bool used[N]; 23 int V,E; 24 25 void dij(int s){ 26 //初始化 27 for(int i=1;i<=V;i++){ 28 dis[i]=INF; 29 used[i]=false; 30 } 31 dis[s]=0; 32 33 while(true){ 34 int k=-1; 35 for(int i=1;i<=V;i++){ 36 if(!used[i]&&(k==-1||dis[k]>dis[i])) 37 k=i; 38 } 39 if(k==-1) break; 40 used[k]=true; 41 for(int i=1;i<=V;i++){ 42 dis[i]=min(dis[i],dis[k]+cost[k][i]); 43 } 44 } 45 } 46 47 int main(){ 48 memset(cost,0x3f,sizeof(cost)); 49 scanf("%d%d",&E,&V); 50 for(int i=1;i<=E;i++){ 51 int a,b,len; 52 scanf("%d%d%d",&a,&b,&len); 53 //判重边 54 cost[a][b]=cost[b][a]=min(cost[a][b],len); 55 } 56 dij(1); 57 printf("%d ",dis[V]); 58 return 0; 59 }