1381:城市路(Dijkstra)
1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 5 int n,m; 6 bool vis[2005];//访问标记 7 int dis[2005];//最短距离 8 struct node{ 9 int v; 10 int d; 11 }; 12 vector<node> adj[2005];//图(邻接表) 13 14 void Bellman_Ford(int s){//核心代码 15 // for(int i=0;i<n;i++){ 16 // dis[i]=INF; 17 // } 18 memset(dis,0x3f,sizeof(dis)); 19 dis[s]=0; 20 for(int i=0;i<n-1;i++){ 21 bool check=0; 22 for(int j=1;j<=n;j++){ 23 for(int k=0;k<adj[j].size();k++){ 24 int v=adj[j][k].v; 25 int d1=adj[j][k].d; 26 if(dis[v]>dis[j]+d1){ 27 dis[v]=dis[j]+d1; 28 check=1; 29 } 30 } 31 } 32 if(check==0) break; 33 } 34 } 35 36 int main(){ 37 cin>>n>>m; 38 // scanf("%d%d", &n, &m); 39 for(int i=1;i<=m;i++){ 40 int a,b; 41 int c; 42 cin>>a>>b>>c; 43 // scanf("%d%d%d",&a,&b,&c); 44 node temp; 45 temp.v=b; 46 temp.d=c; 47 adj[a].push_back(temp); 48 temp.v=a; 49 temp.d=c; 50 adj[b].push_back(temp); 51 } 52 // for(int i=1;i<=n;i++){ 53 // cout<<i<<':'; 54 // for(int j=0;j<adj[i].size();j++){ 55 // cout<<adj[i][j].v<<'('<<adj[i][j].d<<')'<<" "; 56 // } 57 // cout<<endl; 58 // } 59 Bellman_Ford(1); 60 cout<<dis[n]; 61 // printf("%d",dis[n]); 62 return 0; 63 }
1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 5 int n,m; 6 bool vis[2005];//访问标记 7 int dis[2005];//最短距离 8 9 struct node{ 10 int v,d; 11 }; 12 vector<node> adj[2005];//图(邻接表) 13 14 void Dijkstra(int s){//核心代码 15 for(int i=1;i<=n;i++){ 16 dis[i]=INF; 17 } 18 dis[s]=0; 19 for(int i=1;i<=n;i++){ 20 int u=-1,MIN=INF; 21 for(int j=1;j<=n;j++){ 22 if(vis[j]==0 && dis[j]<MIN){ 23 u=j; 24 MIN=dis[j]; 25 } 26 } 27 if(u==-1) return; 28 vis[u]=1; 29 for(int j=0;j<adj[u].size();j++){ 30 int v=adj[u][j].v; 31 if(vis[v]==0 && dis[u]+adj[u][j].d<dis[v]){ 32 dis[v]=dis[u]+adj[u][j].d; 33 } 34 } 35 } 36 } 37 38 int main(){ 39 cin>>n>>m; 40 for(int i=1;i<=m;i++){ 41 int a,b,c; 42 cin>>a>>b>>c; 43 node temp; 44 temp.v=b; 45 temp.d=c; 46 adj[a].push_back(temp); 47 temp.v=a; 48 temp.d=c; 49 adj[b].push_back(temp); 50 } 51 // for(int i=1;i<=n;i++){ 52 // cout<<i<<':'; 53 // for(int j=0;j<adj[i].size();j++){ 54 // cout<<adj[i][j].v<<'('<<adj[i][j].d<<')'<<" "; 55 // } 56 // cout<<endl; 57 // } 58 Dijkstra(1); 59 if(dis[n]==INF) cout<<-1; 60 else cout<<dis[n]; 61 return 0; 62 }
1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 5 int n,m; 6 int mp[2005][2005];//图(邻接矩阵) 7 bool vis[2005];//访问标记 8 int dis[2005];//最短距离 9 10 void Dijkstra(int s){//核心代码 11 memset(dis,0x3f,sizeof(dis)); 12 dis[s]=0; 13 for(int i=1;i<=n;i++){ 14 int u=-1,MIN=INF; 15 for(int j=1;j<=n;j++){ 16 if(vis[j]==0 && dis[j]<MIN){ 17 u=j; 18 MIN=dis[j]; 19 } 20 } 21 if(u==-1) return; 22 vis[u]=1; 23 for(int v=1;v<=n;v++){ 24 if(vis[v]==0 && mp[u][v]!=INF && dis[u]+mp[u][v]<dis[v]){ 25 dis[v]=dis[u]+mp[u][v]; 26 } 27 } 28 } 29 } 30 31 int main(){ 32 memset(mp,0x3f,sizeof(mp)); 33 cin>>n>>m; 34 for(int i=1;i<=m;i++){ 35 int a,b,c; 36 cin>>a>>b>>c; 37 mp[a][b]=min(c,mp[a][b]); 38 mp[b][a]=min(c,mp[a][b]); 39 } 40 for(int i=1;i<=n;i++){ 41 mp[i][i]=0; 42 } 43 // for(int i=1;i<=n;i++){ 44 // for(int j=1;j<=n;j++){ 45 // if(mp[i][j]!=INF) cout<<mp[i][j]<<" "; 46 // else cout<<'-'<<" "; 47 // } 48 // cout<<endl; 49 // } 50 Dijkstra(1); 51 if(dis[n]!=INF) cout<<dis[n]; 52 else cout<<-1; 53 return 0; 54 }