标签:
最短路模板。
题意:从‘1’点发出一个信号到各个点,不同的点可以同时发出一个信号但到达目标的时间不同,问所有点接受到信号所耗费的最短时间为多少。
思路:迪杰斯特拉求出1点到各个点的最短路,遍历一遍找到其中的最大值就可以了。
#include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #include<cmath> #define INF 0x3f3f3f3f #define MAX 1005 using namespace std; int Map[MAX][MAX],n,vis[MAX],dist[MAX]; void Add(char str[],int x,int y) { int i,len=strlen(str),num=0; if(str[0]==‘x‘) { Map[x][y]=Map[y][x]=INF; } else { for(i=0;i<len;i++) { num=num*10+(str[i]-‘0‘); } Map[x][y]=Map[y][x]=num; } } int dij() { int i,j,k,minn; memset(vis,0,sizeof(vis)); for(i=2;i<=n;i++) dist[i]=Map[1][i]; vis[1]=1; for(i=1;i<n;i++) { minn=INF; for(j=1;j<=n;j++) { if(minn > dist[j] && !vis[j]) { minn=dist[j]; k=j; } } vis[k]=1; for(j=1;j<=n;j++) { if(dist[j] > dist[k] + Map[k][j]) dist[j]=dist[k]+Map[k][j]; } } int ans=0; for(i=2;i<=n;i++) ans=max(dist[i],ans); //遍历找到最大边 return ans; } int main() { int i,j; char str[MAX]; while(scanf("%d",&n)!=EOF) { for(i=2;i<=n;i++) { for(j=1;j<i;j++) { scanf("%s",str); Add(str,i,j); } } int ans=dij(); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/alan-W/p/5665622.html