您的位置:首页 > Web前端

zoj 1589 Professor John(Dijkstra~)

2010-08-14 15:31 295 查看
哈~这道题还算顺利~~一次AC~



就是比大小哈,给你一些关系,然后输出X<Y的形式。



我的想法是,将这些关系输入到一个邻接矩阵里,X<Y 的话MAP[X][Y] = -1,大于等于-1, 其他点都为0;



然后找最小的更新点即可,输出的话,输出dis中小于0的点,当然不包括在输入里小于关系的。细节处理比较纠结。



第一次用函数做DIJ哎。。。哈哈~~以后要养成好习惯,嗯嗯。



#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int map[30][30],flag[30][30],var[30],count =1;
void input()
{
    int n,tx,ty;
    char x,y,rel;
    scanf("%d",&n);
    memset(map,0,sizeof(map));
    memset(flag,0,sizeof(flag));
    memset(var,0,sizeof(var));
    getchar();
    while(n--)
    {
        scanf("%c%c%c",&x,&rel,&y);
        getchar();
        tx = x-'A'+1; ty = y-'A'+1;
        var[tx] = 1; var[ty] = 1;
        if(rel == '>')
        {
            map[tx][ty] = 1;
            map[ty][tx] = -1;
            flag[ty][tx] = 1; //如果输入已经小于了,则不用输出,在这里标记。 
        }
        else
        {
            map[tx][ty] = -1;
            map[ty][tx] = 1;
            flag[tx][ty] = 1; //同上 
        }
    }               
}
void dijkstra() 
{
    int k,now,j,i,none = 1;
    int dis[30],hash[30],min;
    printf("Case %d:/n",count++);
    for(k=1; k<=26; k++)
    {
        if( var[k] )   //因为不确定是否按26个字母的顺序输入的,所以不确定有几个需要更新的点 
        {
            memset(dis,0,sizeof(dis));
            memset(hash,0,sizeof(hash));
            now = k; hash[now] = 1;
            for(j=1; j<=26; j++)
                if( var[j] )
                {
                    for(i=1; i<=26; i++)
                        if( var[i] && i!= now && map[now][i] < 0 && dis[i] > dis[now] + map[now][i] )
                        {
                            dis[i] = dis[now] + map[now][i];
                        }
                    min = 0;
                    for(i=1; i<=26; i++)
                        if( var[i] && dis[i] < min && !hash[i] )
                        {
                            min = dis[i];
                            now = i;
                        }
                    hash[now] = 1;
                }
            for(i=1; i<=26; i++)
                if( !flag[k][i] && dis[i]<0 )
                {
                    none = 0;
                    printf("%c<%c/n",k+'A'-1,i+'A'-1);
                }
        }
    }
    if( none )
        printf("NONE/n");
}
int main(void)
{
    int ncases,i,j,k;
    scanf("%d",&ncases);
    while(ncases--)
    {
        input();
        dijkstra();
    }
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: