【最短路径-Dis】hdu 1311 Relative Relatives

来源:互联网 发布:湖北高校就业网络联盟 编辑:程序博客网 时间:2024/05/16 05:46

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;}


0 0
原创粉丝点击