标签:
题目链接:
http://acm.split.hdu.edu.cn/showproblem.php?pid=3665
#include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10+10; #define met(a,b) memset(a,b,sizeof(a)) #define inf 0x3f3f3f3f int map[maxn][maxn]; int visited[maxn],dis[maxn]; int num[maxn]; int n,m; void dijkstra(int x) { int min=0,p=0; for(int i=0;i<n;i++) { dis[i]=map[x][i]; visited[i]=0; } visited[x]=1; for(int i=0;i<n;i++) { min=inf; for(int j=0;j<n;j++) { if(!visited[j]&&dis[j]<min) { min=dis[j]; p=j; } } visited[p]=1; for(int j=0;j<n;j++) { if(!visited[j]&&dis[p]+map[p][j]<dis[j]) dis[j]=dis[p]+map[p][j]; } } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=inf; met(num,0); for(int i=0;i<n;i++) { scanf("%d%d",&m,&num[i]); for(int j=0;j<m;j++) { int x,y; scanf("%d%d",&x,&y); map[i][x]=map[x][i]=y; } } dijkstra(0); int ans=inf; for(int i=0;i<n;i++) { if(num[i]==1) ans=min(ans,dis[i]); } printf("%d\n",ans); } }
标签:
原文地址:http://www.cnblogs.com/TAT1122/p/5853273.html