HDU2066 一個人的旅行

  題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2066

  把與家相鄰的地方與N+1相連,邊長爲0

  把想到的地方與N+2相連,邊長爲0

  N爲所出現的數字的Max

  刷N+1到N+2的最短路,單源最短路刷Dijkstra

  貼代碼

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1005;
int g[maxn][maxn];
int d[maxn];
bool vis[maxn];
int main(){
//	freopen("2066.in","r",stdin);
//	freopen("2066.out","w",stdout);
	int T,S,D;
	while (scanf("%d%d%d",&T,&S,&D)!=EOF){
		memset(g,0x3f,sizeof(g));
		memset(d,0x3f,sizeof(d));
		memset(vis,0,sizeof(vis));
		int N=0;
		while (T--){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			if (z<g[x][y])g[x][y]=g[y][x]=z;
			N=x>N?x:N;
			N=y>N?y:N; 
		}
		for (int i=1;i<=N+2;i++)g[i][i]=0;
		while (S--){
			int x;
			scanf("%d",&x);
			g[x][N+1]=g[N+1][x]=0; 
		}
		while (D--){
			int x;
			scanf("%d",&x);
			g[x][N+2]=g[N+2][x]=0; 
		}
		d[N+1]=0;
		int min,k;
		for (int i=1;i<=N+1;i++){
			min=d[0];k=0;
			for (int j=1;j<=N+2;j++)
				if ((!vis[j])&&(d[j]<min))k=j,min=d[j];
			vis[k]=1;
			for (int j=1;j<=N+2;j++)
				if (d[k]+g[k][j]<d[j])d[j]=d[k]+g[k][j];
		}
		printf("%d\n",d[N+2]);
	}
	return 0;
} 
【寫的有漏洞的,歡迎路過大神吐槽】

  2017/07/24 23:31:27

  Ending. 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章