7-9 旅遊規劃 (25 分)
阿新 • • 發佈:2019-01-06
//這個題跟個板題差不多,跌死啦演算法,暑假第一週學過,當時學的挺明白的,現在就都忘了,又重新看了看網課,不錯,稍微看一點就行了,DIj用來計算兩個點的最短路徑,就是不斷找最短的路,然後一次次的更新就行了。哎
怎麼都忘了 。。
這個題我弄了個結構體就來存路長和過路費,然後跟板子一樣。
還有今天大學的運動會結束了,應該是人生最後一次參加運動會了(儘管這次沒有報專案),我覺得應該記錄一下,儘管這兩天非常無聊,還掉了一小塊牙,但這是最後一次,值得寫一下。
#include <iostream> #include <cstring> #include <cstdio> #define INF 0x3f3f3f3f using namespace std; struct node{ int dst; int cost; node():dst(INF),cost(INF) { } }; int N,M,S,D; node mp[510][510]; node dis[510]; int book[510]; void dij(int s,int e){ dis[s].cost=0; dis[s].dst=0; int i,j; for(int i=0;i<N;i++){ int minw=INF; int minv; int minc=INF; for(j=0;j<N;j++){ if(book[j]) continue; if(dis[j].dst<minw){ minv=j; minc=dis[j].cost; minw=dis[j].dst; } else if(dis[j].dst==minw){ if(dis[j].cost<minc){ minv=j; minc=dis[j].cost; minw=dis[j].dst; } } } //cout<<minv<<minc<<minw<<endl; book[minv]=1; if(minv==e) break; for(j=0;j<N;j++){ if(book[j] || !mp[minv][j].dst) continue; if(dis[j].dst>dis[minv].dst+mp[minv][j].dst){ dis[j].dst=dis[minv].dst+mp[minv][j].dst; dis[j].cost=dis[minv].cost+mp[minv][j].cost; } else if(dis[j].dst==dis[minv].dst+mp[minv][j].dst){ if(dis[j].cost > dis[minv].cost+mp[minv][j].cost){ dis[j].dst=dis[minv].dst+mp[minv][j].dst; dis[j].cost=dis[minv].cost+mp[minv][j].cost; } } } } cout<<dis[e].dst<<" "<<dis[e].cost<<endl; } int main(){ int a,b,c,d; memset(dis,INF,sizeof(dis)); memset(book,0,sizeof(book)); memset(mp,INF,sizeof(mp)); scanf("%d%d%d%d",&N,&M,&S,&D); //S是出發地 D是目的地 N是城市個數 M是公路條數 for(int i=1;i<=M;i++){ cin>>a>>b>>c>>d; if(c>mp[a][b].dst || d>mp[a][b].cost) continue; mp[a][b].dst=c; mp[b][a].dst=c; mp[a][b].cost=d; mp[b][a].cost=d; } dij(S,D); return 0; }