poj 1122 FDNY to the Rescue!


反向存图 dijstra 记录路径

奇怪的输入输出

输入:用字符串存最后一行

输出:\t 来水平制表

#include <iostream>
#include <memory.h>
#include <string>
#include <stdio.h>
#include <algorithm>
#define IN (1<<28)
using namespace std;
struct node
{
    int id;
    int dist;
};
bool cmp( const node &a, const node &b )
{
    return a.dist < b.dist;
}
node des[25];
int N, G[25][25], path[25], src, dist[25];
int visited[25];
char str[500];
int k;
void dij()
{
    for( int i = 1; i <= N; i++ )
        dist[i] = G[src][i];
    dist[src] = 0;
    visited[src] = 1;
    while(1)
    {
        int MinV = 0, Min = IN;
        for( int i = 1; i <= N; i++ )
            if( !visited[i] && dist[i] < Min )
            {
                Min = dist[i];
                MinV = i;
            }
        if( !MinV )
            break;
        visited[MinV] = 1;
        for( int i = 1; i <= N; i++ )
        {
            if( !visited[i] && dist[i] > Min + G[MinV][i] )
            {
                dist[i] = Min + G[MinV][i];
                path[i] = MinV;
            }
        }
    }
}
void PathPrint( int i )
{
    if( i==path[i] )
    {
        printf("%d\t%d\n",i,src);
        return ;
    }
    printf("%d\t",i);
    PathPrint( path[i] );
}
void Input()
{
    printf("Org	Dest	Time	Path\n");
    for( int i = 1; i < k; i++ )
    {
        printf("%d\t%d\t%d\t", des[i].id, des[0].id,des[i].dist );
        if( des[i].id == des[0].id )
        {
            printf("%d\n", des[0].id );
        }
        else
            PathPrint(des[i].id);
    }
}
int main()
{
    while( cin >> N )
    {
        memset( G, 0, sizeof(G) );
        memset( path, 0, sizeof(path) );
        memset( visited, 0, sizeof(visited) );
        memset( str, 0, sizeof(str) );
        for( int i = 1; i <= N; i++ )
            for( int j = 1; j <= N; j++ )
            {
                cin >> G[j][i];
                path[i] = i;
                if( G[j][i] == -1 )
                    G[j][i] = IN;
            }
        gets(str);//吸收换行符
        gets(str);
        int t = 0;
        k = 0;
        for(int i=0; str[i]!='\0'; i++)
        {
            if(str[i]>='0'&&str[i]<='9')
            {
                t=t*10+str[i]-'0';
            }
            else if(t!=0)
            {
                des[k++].id=t;
                t=0;
            }
        }
        if(t!=0)
            des[k++].id=t;//最后一个字符
        src = des[0].id;
        dij();
        for( int i = 0; i < k; i++ )
            des[i].dist = dist[ des[i].id ];
        sort( des+1, des + k, cmp);
        Input();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xutian_curry/article/details/80229987