http://acm.hdu.edu.cn/showproblem.php?pid=1311
分析:年龄相同时,按名字排序
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int NM=105;
const int MAX=0xfffffff;
char str[1000][NM];
bool vis[NM];
int a[NM][NM],k,n;
struct Node{
int vau,id;
}dis[NM];
inline int find(char *cs){
bool flag=false;
int j;
for(j=0;j<k;j++){
if(strcmp(str[j],cs)==0) {
flag=true;break;
}
}
if(flag) return j;
else return -1;
}
void Dijkstra(int v)
{
int i,j,mmin,u;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
dis[i].vau=a[v][i];
dis[i].id=i;
}
dis[v].vau=0;vis[v]=true;
for(j=1;j<n;j++){
mmin=MAX;u=v;
for(i=1;i<=n;i++){
if(!vis[i] && dis[i].vau<mmin){
mmin=dis[i].vau;u=i;
}
}
vis[u]=true;
for(i=1;i<=n;i++){
if(!vis[i] && dis[i].vau>dis[u].vau+a[u][i]){
dis[i].vau=dis[u].vau+a[u][i];
}
}
}
}
bool comp(struct Node A,struct Node B){
if(A.vau==B.vau){
if(strcmp(str[A.id],str[B.id])<0) return 1;
else return 0;
}
return A.vau<B.vau;
}
int main()
{
int i,j,T,x,y,vau,kk;
char cs1[NM],cs2[NM];
scanf("%d",&T);
kk=1;
while(T--){
scanf("%d",&n);
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
a[i][j]=MAX;
k=1;
memset(str,0,sizeof(str));
strcpy(str[0],"Ted");
for(i=1;i<=n;i++){
scanf("%s%s%d",cs1,cs2,&vau);
x=find(cs1);
if(x==-1) {strcpy(str[k],cs1);x=k++;}
y=find(cs2);
if(y==-1) {strcpy(str[k],cs2);y=k++;}
a[x][y]=a[y][x]=vau;
}
Dijkstra(0);
sort(dis+1,dis+n+1,comp);
printf("DATASET %d\n",kk++);
for(i=1;i<=n;i++)
printf("%s %d\n",str[dis[i].id],100-dis[i].vau);
}
return 0;
}