hdu 3631 多源最短路经

 

/*

碰巧看到,WA很多次,看过别人代码A的
  
题意:
	  有向图
	  当输入0 x 标记x为可以通过的点
	  当输入1 a b是求出两点之间最短路,必须是过标记过的点
	  	
后记:
	  注意区别有向图和无向图		  
			
*/


#include <stdio.h>
#include <iostream>
using namespace std;
#define Max 999999999
#define N 305
int edges[N][N];
int visit[N],n;
void init()
{
	int i,j;	
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++){
			edges[i][j]=Max;
		}
		edges[i][i]=0;
		visit[i]=0;
	}
}
void floyd(int k,int n)
{
	int i,j;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			if(edges[i][k]+edges[k][j]<edges[i][j])
				edges[i][j]=edges[i][k]+edges[k][j];
		}
}
int main()
{
	int m,q,i,j,cas=1,a,b,c;
	while(scanf("%d %d %d",&n,&m,&q)!=EOF&&(n||m||q))
	{
		if(cas>1) printf("\n");
	
		init();
		for(i=0;i<m;i++)
		{
			scanf("%d %d %d",&a,&b,&c);
			if(c<edges[a][b]){
				edges[a][b]=c;
			}
		}
             printf("Case %d:\n",cas++);
for(i=0;i<q;i++) { scanf("%d",&a); if(a) { scanf("%d %d",&b,&c); if(!visit[b]||!visit[c]) { printf("ERROR! At path %d to %d\n",b,c); } else { if(edges[b][c]==Max) printf("No such path\n"); else printf("%d\n",edges[b][c]); } } else { scanf("%d",&b); if(!visit[b]) { visit[b]=1; floyd(b,n); } else printf("ERROR! At point %d\n",b); } } } return 0; }
posted @ 2010-11-21 11:29  kfinder  阅读(346)  评论(0编辑  收藏  举报