//朴素算法
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include <memory.h> #define INF 0x3f3f3f using namespace std; int s,m,n; int dis[1000]; int vis[1000]; int edge[1000][1000]; int outNum; void init(){ memset(dis,0x3f3f3f,sizeof(dis)); outNum=0; for(int i=0;i<n;i++){ dis[i]=min(dis[i],edge[s][i]); } } void dijkstra(){ init(); dis[s]=0; vis[s]=1; outNum++; while(1){ int minm=INF,idx; for(int i=0;i<n;i++){ if(!vis[i]&&dis[i]<minm){ minm = dis[i]; idx=i; } } vis[idx]=1; outNum++; if(outNum==n) break; for(int i=0;i<n;i++){ if(vis[i]) continue; dis[i]=min(dis[i],minm+edge[idx][i]); } } for(int i=0;i<n;i++) printf("from: %d to: %d dis: %d\n",s,i,dis[i]); } int main(){ memset(edge,0x3f3f3f,sizeof(edge)); cin>>n>>m>>s; for(int i=0;i<n;i++){ edge[i][i]=0; } for(int i=0;i<m;i++){ int a,b,c; cin>>a>>b>>c; edge[a][b]=edge[b][a]=c; } dijkstra(); }
/* mock-data
6 9 0
0 1 93
0 4 64
0 5 6
1 2 7
2 5 12
2 3 19
3 5 2
3 4 8
4 5 5 */
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<time.h> using namespace std; #define INF 0x3f3f3f3f //定义一个很大的数 typedef struct node { int num,val; //存放结点编号和到初始点的距离 node(){} node(int n,int v):num(n),val(v){} bool operator < (const node &a)const { return val==a.val?num>a.num:val>a.val; //先出小 } } nod; priority_queue<nod> qq;; //优先从小到大 int edge[2010][2010]; int dis[2010]; int vis[2010]; int m,n,s; void dijkstra() { dis[1]=0; while(!qq.empty()) { nod fir=qq.top(); qq.pop(); if(vis[fir.num]) continue; vis[fir.num]=1; for(int i=1; i<=m; i++) { if(!vis[i]&&dis[i]>fir.val+edge[i][fir.num]) { dis[i]=fir.val+edge[i][fir.num]; qq.push(node(i,dis[i])); } } } } int main() { memset(dis,INF,sizeof(dis)); memset(edge,INF,sizeof(edge)); scanf("%d%d",&n,&m); int a,b,c; for(int i=1; i<=n; i++) { scanf("%d%d%d",&a,&b,&c); if(c<edge[a][b]) edge[a][b]=edge[b][a]=c; } nod fir; fir.num=1; fir.val=0; qq.push(fir); dijkstra(); printf("%d\n",dis[m]); }