poj 3767 I Wanna Go Home
2011-08-16 17:26
423 查看
题目分析: 这个题属于典型的dijkstra 算法的题; n个村庄,m 条路 和两村庄之间所用时间 |
最后是各个城市所属阵营; 题意分析: 分为两个阵营,1,2城市分别属于1,2阵营(题意简单化题目)求从城市1到城市2 的最短时间 重点: 可以从城市1到2,反则不行:因此,在这加上判断条件,套用dijkstra算法就ok了 |
#include<stdio.h> #define max 0x7fffffff int grah[601][601]; int root[601]; int n; void dij() { int d[601]; bool vis[601]={false}; int i,j,pos=0; for(i = 0;i < n; i++) d[i] = grah[0][i]; vis[0] = true ; for( i= 1; i <= n; i++) { int min=max; for(j = 0; j < n; j++) { if( ! vis[j] && min > d[j]) { min=d[j]; pos = j; } } vis[pos] = true; for( j = 0;j < n ;j++) { if( !vis[j] && grah[pos][j] < max && !(root[pos] == 2 && root[j] == 1)) { if(d[j] > d[pos]+ grah[pos][j]) d[j] = d[pos] + grah[pos][j]; } } } if(d[1] < max) printf("%d\n",d[1]); else printf("-1\n"); } int main() { // freopen("e://1.txt","r",stdin); int m,x,y,z,i,j; while(scanf("%d",&n),n) { for(i = 0;i < n;i++) for(j = 0;j < n;j++) { if(i==j) grah[i][j]=0; else grah[i][j]=max; } scanf("%d",&m); while(m--) { scanf("%d%d%d",&x,&y,&z); grah[x-1][y-1]=grah[y-1][x-1]=z; } for(i = 0;i < n;i++) scanf("%d",root+i); dij(); } return 0; }
相关文章推荐
- POJ 3767 I Wanna Go Home(Dijkstra)
- POJ 3767 I Wanna Go Home 最短路
- POJ 3767 I Wanna Go Home
- poj_3767——I Wanna Go Home
- POJ 3767 I Wanna Go Home(最短路/Floyd)
- poj 3767 I Wanna Go Home
- poj 3767 I Wanna Go Home
- POJ 3767 I Wanna Go Home
- POJ-3767 I Wanna Go Home -----有限制的dijkstra
- POJ 3767 I Wanna Go Home 笔记 最短路径
- POJ 3767 I Wanna Go Home【最短路,Dijkstra+spfa,题意是关键呀】
- poj 3767 I Wanna Go Home
- poj 3767 I Wanna Go Home
- poj 3767 I Wanna Go Home 最短路spfa
- POJ 3767 I Wanna Go Home (dijkstra算法)
- POJ 3767 I Wanna Go Home【最短路floyd】
- POJ - 3767 - I Wanna Go Home
- POJ 3767 I Wanna Go Home
- poj 3767 I Wanna Go Home
- PKU I Wanna Go Home 3767 Dijsktra 优先队列 + BFS