一道很明显的模板题啊!可是又再次证明了自己写的模板是正确的,我彻底对今天所做的一道很坑爹的题无语到爆!
Dijkstra + atoi ;
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <cstdio>
#define M 1000000
using namespace std;
struct Node
{
int num;
int n;
}node[101];
int w[101][101],cot[101],d;
priority_queue<Node>q;
bool operator < (const Node& a,const Node& b)
{
if(a.num > b.num) return 1;
else return 0;
}
void init()
{
int i,j;
for(i = 0;i < 101;i ++)
for(j = 0;j < 101;j ++)
w[i][j] = M;
memset(cot,0,sizeof(cot));
for(i = 0;i < 101;i ++)
{
node[i].num = M;
node[i].n = i;
}
node[1].num = 0;
}
void relax(int u,int v)
{
if(node[v].num > node[u].num + w[u][v])
node[v].num = node[u].num + w[u][v];
}
void Dij()
{
int i;
for(i = 1;i <= d;i ++)
if(cot[i] == 0)
q.push(node[i]);
int len = q.top().n;
for(i = 1;i <= d;i ++)
if(w[len][i] != M)
relax(len,i);
cot[len] = 1;
while(!q.empty()) q.pop();
}
int main()
{
int i,j,k;
char c[100000];
while(scanf("%d",&d)!=EOF)
{
k = 0;
init();
for(i = 2;i <= d;i ++)
for(j = 1;j < i;j ++)
{
scanf("%s",&c);
if(strcmp(c,"x")!=0) w[i][j] = atoi(c);
else w[i][j] = M;
w[j][i] = w[i][j];
}
for(i = 1;i <= d;i ++)
Dij();
for(i = 2;i <= d;i ++)
if(k < node[i].num) k = node[i].num;
printf("%d\n",k);
}
return 0;
}