Dijk入門(杭電2544題)
阿新 • • 發佈:2019-05-10
記錄 如果 turn 循環 不存在 stream 條件 ostream fin
#include<iostream> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int n,m; int map[105][105]; int vis[105]; int stemp[105]; int dijk(){ memset(vis,0,sizeof(vis)); vis[1]=1; //標記第一個已選 memset(stemp,0,sizeof(stemp)); int min; int flag1=100000,countx=0,county,index2;while(county!=n){//如果是聯通圖那最先遍歷到的就是最小的 for(int i=1;i<=n;i++){//第一重循環尋找可以擴展的點 if(vis[i]){ min=INF; for(int j=1;j<=n;j++){//第二重循環找到該點最短的擴展點 if(!vis[j]&&min>map[i][j]){ index2=j; min=map[i][j]; } } } if(vis[i]&&min+stemp[i]<stemp[countx]+flag1){ //比較每個點的最小擴展點,選出總距離最短的標記該點和對應的擴展點 flag1=min; countx=i; county=index2; } } // cout<<"!"<< flag1<<‘ ‘<<countx<<‘ ‘<<county<<endl;map[county][countx]=INF;//一但往前走就不存在回溯 stemp[county]=flag1+stemp[countx];//記錄每一個已選的路程 vis[county]=1; flag1=INF;//初始化第一個點滿足條件 countx=0; } return stemp[n]; } int main(){ while(cin>>n>>m){ if(!n&&!m) break; memset(map,INF,sizeof(map)); while(m--){ int a,b,c; cin>>a>>b>>c; map[a][b]=c; map[b][a]=c; } cout<<dijk()<<endl; } }
Dijk入門(杭電2544題)