1. 程式人生 > >ccf 201609-4 交通規劃

ccf 201609-4 交通規劃

dij最短路徑

#include<iostream>
#include<vector>
using namespace std;
class edg{
public:
    int n,cost;//...
    //cost代表到1臨時長度 ,n表示臨時花費 
};
vector<edg> ee[100005];
int D[10005];
edg T[10005];
int vis[10005];
int _min,_v;
int n,m;
void updateT(int v){
    for(int i=0;i<ee[v].size();++i){
        if(!vis[ee[v][i].n] && (ee[v][i].cost+D[v]<T[ee[v][i].n].cost ||
        (ee[v][i].cost+D[v]==T[ee[v][i].n].cost && ee[v][i].cost<=T[ee[v][i].n].n))){
            T[ee[v][i].n].cost=ee[v][i].cost+D[v];
            T[ee[v][i].n].n=ee[v][i].cost;
        }
    }
}
void
findmin(){ _min=199999999; for(int i=1;i<=n;++i){ if(!vis[i] && _min>T[i].cost){ _min=T[i].cost; _v=i; } } } int main(){ // setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20); cin>>n>>m; int a,b,c; edg tmp; tmp.cost=tmp.n=199999999
; for(int i=1;i<=n;++i) T[i]=tmp; while(m--){ scanf("%d %d %d",&a,&b,&c); tmp.cost=c; tmp.n=a; ee[b].push_back(tmp); tmp.n=b; ee[a].push_back(tmp); } vis[1]=1; updateT(1); m=n-1; int re=0; while(m--){ findmin(); vis[_v]=1
; D[_v]=_min; re+=T[_v].n; updateT(_v); } cout<<re<<endl; }