ccf 201609-4 交通規劃
阿新 • • 發佈:2019-02-06
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;
}