hdu 3631 Shortest Path(2010天津网选题)

情何以堪!!!
情何以堪!!!
情何以堪!!!
情何以堪!!!
情何以堪!!!

题目读错了,有木有啊!!!然后输出的漏读了!!!神呐!!终于完全理解题意了!!写超时了!!!其实本来就应该计算出来用dijksra一定会超时的 = =。。。
好吧,不发牢骚了。

这题是给你一个多重图(输入注意有重边),然后有两种操作,0是mark,1是求x 到y的最短路。当且仅当x y 都mark过而且x ->y可以经过一条端点都mark过的路求最短路。
用dijkstra显然超时,然后我就把floyd改了改,在每次增加标记点的时候就用floyd更新权值。这样的话找路的代价就是O(1)了。虽然更新的时候是O(N^2),不过想下,最多有300个点,那么也就是最多也就更新300次(更新过的不用更新的),也就是300^3,这个代价还是可以承受的。
然后排除种种低级错误,A掉了。。。看AC人数来看,这应该是去年天津网选比较水的题了。(话说,去年天津赛区网选我应该也有看吧。。。不过那时候太水。。

#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>

using namespace std;

const int MAX = 310;
int map[MAX][MAX];

void Floyd(int x,int n)
{
	for(int k=0; k<n; k++)
        for(int j=0; j<n; j++)
            if( map[k][x] != INT_MAX && map[x][j] != INT_MAX 
                && map[k][j] > map[k][x] + map[x][j] )
                    map[k][j] = map[k][x] + map[x][j];
}

int main()
{
    int n,m,q,ind = 1,x,y,w,p;

    while( ~scanf("%d%d%d",&n,&m,&q) )
    {
		if( ! (n || m || q ) ) break;
		if( ind != 1 )
			printf("\n");
        bool mark[MAX];
        memset(mark,false,sizeof(mark));
        for(int i=0; i<MAX; i++)
        {
            for(int k=0; k<MAX; k++)
                map[i][k] = INT_MAX;
            map[i][i] = 0;
        }
        
        while( m-- )
        {
            scanf("%d%d%d",&x,&y,&w);
            if( map[x][y] > w )
                map[x][y] = w;
        }
        printf("Case %d:\n",ind++);
        while( q-- )
        {
            scanf("%d",&p);
            if( p == 0 )
            {
                scanf("%d",&x);
                if( mark[x] )
                    printf("ERROR! At point %d\n",x);
                else
                {
					mark[x] = true;
					Floyd(x,n);
				}
            }
            else
            {
                scanf("%d%d",&x,&y);
				if( !mark[x] || !mark[y] )
					printf("ERROR! At path %d to %d\n",x,y);
				else
				{
					if( map[x][y] == INT_MAX )
						printf("No such path\n");
					else
						printf("%d\n",map[x][y]);
				}
            }
        }
    }

return 0;
}


你可能感兴趣的:(hdu 3631 Shortest Path(2010天津网选题))