1. 程式人生 > >Dijk入門(杭電2544題)

Dijk入門(杭電2544題)

記錄 如果 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題)