题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
3 ?
代码:
#include<iostream> using namespace std; const int N=105; const int INF=1<<29; int Map[N][N]; int vis[N]; int dir[N]; int n,m,a,b,v; int ans; void init() { ans=0; for(int i=1;i<N;i++){ for(int j=1;j<N;j++){ if(i==j) Map[i][j]=0; else Map[i][j]=Map[j][i]=INF; } } for(int i=1;i<N;i++) vis[i]=0; } void prim() { for(int i=1;i<=n;i++) dir[i]=Map[1][i]; vis[1]=1; for(int i=1;i<n;i++){ // n个村庄,n-1条路; int Min=INF; int st=1; for(int j=1;j<=n;j++){ // 从1出发,每次可以走的最短的路; if(!vis[j]&&dir[j]<Min){ Min=dir[j]; // 当前可以走的最短路; st=j; // 记录位置; } } ans+=Min; // 路径更新; vis[st]=1; // 标记; for(int j=1;j<=n;j++){ if(!vis[j]&&(Map[st][j]+dir[st])<dir[j]){ dir[j]=Map[st][j]; // 更新从1到每个村庄的最短路; } } } } int main() { cin.sync_with_stdio(false); // n为道路条数,m为村庄数; while(cin>>m>>n&&m){ init(); for(int i=0;i<m;i++){ cin>>a>>b>>v; if(v<Map[a][b]){ // 避免一条路,不同长度; Map[a][b]=Map[b][a]=v; } } prim(); if(ans>=INF) cout<<"?"<<endl; else cout<<ans<<endl; } return 0; }