poj 1122

来源:互联网 发布:js读取txt文件内容 编辑:程序博客网 时间:2024/06/06 04:16

输出错了n遍

道路距离为0没考虑错了n遍快哭了



#include <iostream>

#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 1000000 //无穷大
#define MAXN 200 //顶点个数的最大值
using namespace std;


int n; //顶点个数
int Edge[MAXN][MAXN]; //邻接矩阵
int S[MAXN]; //Dijkstra 算法用到的3 个数组
int dist[MAXN]; //
int path[MAXN]; //
void Dijkstra( int v0 ) //求顶点v0 到其他顶点的最短路径
{
    int i, j, k; //循环变量
    for( i=1; i<=n; i++ )
    {
        dist[i] = Edge[v0][i];
        S[i] = 0;
        if( i!=v0 && dist[i]<INF ) path[i] = v0;
        else path[i] = -1;
    }
    S[v0] = 1;
    dist[v0] = 0; //顶点v0 加入到顶点集合S
    for( i=0; i<n-1; i++ ) //从顶点v0 确定n-1 条最短路径
    {
        int min = INF, u = v0;
//选择当前集合T 中具有最短路径的顶点u
        for( j=1; j<=n; j++ ) //(1)
        {
            if( !S[j] && dist[j]<min )
            {
                u=j;
                min = dist[j];
            }
        }
        S[u] = 1; //将顶点u 加入到集合S,表示它的最短路径已求得 //(2)
//修改T 集合中顶点的dist 和path 数组元素值 //(3)
        for( k=1; k<=n; k++ )
        {
            if( !S[k] && Edge[u][k]<INF && dist[u] + Edge[u][k] < dist[k] )
            {
                dist[k] = dist[u] + Edge[u][k];
                path[k] = u;
            }
        }
    }
}
struct p
{
    int path[22];
    int time;
    int org;
    int dest;
    int l;
} a[222];
int cmp(p a,p b)
{
    return a.time<b.time;
}
int main( )
{
    int i, j,k,l,m; //循环变量


    scanf( "%d", &n ); //读入顶点个数n
    for( i=1; i<=n; i++ )


    {
        for( j=1; j<=n; j++ )
        {
            scanf("%d",&Edge[i][j]);
            if(Edge[i][j]==-1||i==j&&Edge[i][j]==0)
                Edge[i][j]=INF;
        }
    }
    int st;
    scanf("%d",&st);
    l=0;
    char c;
    while(c!='\n')
    {
        scanf("%d%c",&a[l++].org,&c);
    }
    i=0;
    sort(a,a+l,cmp);


   for(i=0; i<l; i++)
    {
        Dijkstra(a[i].org);
        a[i].dest=st;
        a[i].time=dist[st];
        memset( a[i].path, 0, sizeof(a[i].path) );
        int k = 0; //k 表示shortest 数组中最后一个元素的下标
        a[i].path[k] = st;
        while( path[ a[i].path[k] ] != 0 )
        {
            k++;
            a[i].path[k] = path[ a[i].path[k-1] ];
        }
        k++;
        a[i].path[k] = 0;
        a[i].l=k-2;
    }
    sort(a,a+l,cmp);
    printf("Org\tDest\tTime\tPath\n");
    for(i=0;i<l;i++)
    {
        printf("%d\t%d\t%d",a[i].org,a[i].dest,a[i].time);
        for(j=a[i].l;j>=0;j--)
        {
            printf("\t%d",a[i].path[j]);
        }
      // printf("%d",a[i].path[j]);
        puts("");
    }
    return 0;
}







0 0
原创粉丝点击