POJ1122

来源:互联网 发布:在人间 知乎 编辑:程序博客网 时间:2024/06/06 09:17

Problem : FDNY to the Rescue!
Description : 有一个矩阵,里面有一个地方着火了,现在有几个消防点,要你求出他们到这个着火点最短时间,并且输出路径。
Solution : 迪杰斯特拉+输出路径,很裸,注意细节就好,当着火点和消防电一样时,路径只需输出着火点。这个地方WA了一次。
Code(C++) :

#include <stdio.h>#include <string.h>#include <stdlib.h>const int M=30;const int INF=0x3f3f3f3f;typedef struct tagNode{    int H;    int t;    tagNode(){}    tagNode(int H,int t):H(H),t(t){}}Node;int n;int map[M][M];int src;int des[M];int num;int pre[M];int dis[M];bool used[M];int cmp(const void *a,const void *b){    Node *A=(Node *)a;    Node *B=(Node *)b;    return A->t-B->t;}void dij(int src){    int i;    for(i=1;i<=n;i++)        dis[i]=map[src][i],        used[i]=false,        pre[i]=-1;    used[src]=true;    for(i=1;i<n;i++)    {        int temp=INF;        int k=src;        int j;        for(j=1;j<=n;j++)            if(temp>dis[j]&&!used[j])                temp=dis[j],k=j;        used[k]=true;        for(j=1;j<=n;j++)            if(dis[j]>dis[k]+map[k][j]&&!used[j])                dis[j]=dis[k]+map[k][j],                pre[j]=k;    }}void print(int x){    if(x==-1)        return ;    printf("\t%d",x);    print(pre[x]);}int main(){    //freopen("in.data","r",stdin);    while(~scanf("%d",&n)){        int i,j;        for(i=1;i<=n;i++)            for(j=1;j<=n;j++){                scanf("%d",&map[j][i]);                map[j][i]=(map[j][i]<0? INF:map[j][i]);            }        scanf("%d",&src);        char c;        num=0;        while(scanf("%d%c",&des[num++],&c),c!='\n');        dij(src);        Node ans[M];        for(i=0;i<num;i++)            ans[i]=Node(des[i],dis[des[i]]);        qsort(ans,num,sizeof(ans[0]),cmp);        printf("Org Dest    Time    Path\n");        for(i=0;i<num;i++){            printf("%d\t%d\t%d",ans[i].H,src,ans[i].t);            int tmp=ans[i].H;            if(ans[i].H==src){                printf("\t%d\n",src);                continue;            }            print(tmp);            printf("\t%d\n",src);        }    }    return 0;}
0 0
原创粉丝点击