题意:给N,表示N个节点。
给半个邻接矩阵,本身到本身的距离是0,边是双向的。当两个节点之间没有直接的边连接的时候,用x表示。
问从第一个节点到其他所有节点至少花费的时间。
这题唯一的处理是处理邻接矩阵的时候处理先当作字符串读入,然后处理一下数据,变成数据格式。
最后是输出第一个节点到其他所有节点最短路的最大值。
#include<stdio.h> #include<string.h> int n; const int inf=99999999; int pho[105][105]; char tmp[105][1000]; bool vis[105]; int dis[105]; void solve(int pos) { vis[pos]=1; for(int i=1;i<=n;i++) { if(!vis[i]&&pho[pos][i]+dis[pos]<dis[i]) { dis[i]=pho[pos][i]+dis[pos]; } } int next=inf; int minn=inf; for(int i=1;i<=n;i++) { if(!vis[i]) { if(minn>dis[i]) { minn=dis[i]; next=i; } } } if(next<=n) solve(next); } int main() { int len; int num; int ttt; scanf("%d",&n); getchar(); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { pho[i][j]=inf; } pho[i][i]=0; dis[i]=inf; } for(int i=2;i<=n;i++) { gets(tmp[i]); } for(int i=2;i<=n;i++) { num=0; len=strlen(tmp[i]); tmp[i][len]=32; ttt=0; for(int j=0;j<=len;j++) { if(tmp[i][j]==32) { num++; pho[num][i]=pho[i][num]=ttt; ttt=0; } else if(tmp[i][j]==‘x‘) { ttt=inf; } else { ttt*=10; ttt+=tmp[i][j]-48; } } } dis[1]=0; solve(1); int maxx=-1; for(int i=1;i<=n;i++) { if(maxx<dis[i]) maxx=dis[i]; } printf("%d\n",maxx); }
时间: 2024-10-20 04:45:37