典型的求最短路径的问题,从1这个节点开始求解~~
找出距离1最远的最短路径。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <map>
#include <vector>
#include <math.h>
#include <queue>
#include <stdlib.h>
#define maxn 1000
#define INF 100000000
using namespace std;
vector < pair <int,int> > g[maxn+10];
char ch[10000],ans[100];
int node,edge,src;
int dis[maxn+10];
bool inQueue[maxn+10];
queue<int> que;
pair <int,int> suit;
void SPFA(){
for (int i=0;i<=node;i++)
dis[i]=INF;
memset(inQueue,false,sizeof(int)*(node+5));
dis[src]=0;
while(!que.empty()){
que.pop();
}
que.push(src);
inQueue[src]=true;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=0; i!=g[u].size(); i++){
if ( dis[u] + g[u][i].second <dis[g[u][i].first] ){ //这里要写上从u开始的距离。
//printf(": %d %d\n",u,g[u][i].first);
//printf(": %d %d\n",dis[u],g[u][i].second);
dis[g[u][i].first] = dis[u] + g[u][i].second;
//printf(" : %d\n",dis[g[u][i].first]);
// printf(": %d %d\n",u,g[u][i].first);
if (!inQueue[g[u][i].first]){
inQueue[g[u][i].first] = true;
que.push(g[u][i].first);
}
}
}
inQueue[u]=false;
}
}
int main()
{
while( scanf("%d",&node)!=EOF ){
getchar();
for(int i=2; i<=node; i++){
gets(ch);
int add,ji=1;
char *p=ch;
while(sscanf(p,"%s%n",ans,&add)!=EOF){
if(ans[0]=='x'){ji++;p=p+add;continue;} //注意这里 忘了赋值ji++了 导致邻接链表更新错误了。
suit.second=atoi(ans);
suit.first=ji;
g[i].push_back(suit);
suit.first=i;
g[ji].push_back(suit);
p=p+add;
ji++;
}
}
src=1;
SPFA();
int max=-1;
for(int i=1;i<=node;i++){
if( max < dis[i] )
max=dis[i];
}
printf("%d\n",max);
}
return 0;
}