标签:
题目链接:
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