Dijkstra解決POJ 2263
題目:http://poj.org/problem?id=2263
題目大意:有n個城市,r條連接兩個城市的道路,每條道路有自己的最大復載量。現在問從城市cst到城市cen,車上的最大載重能為多少。
雖然是提交了,也搞懂了,但是還沒有徹底的明白。
因此,也不便多說什么,當我徹底明白的時候再說吧。
呵呵,終于完全的明白了,下面指出一二。
1.一定要明白map[][]的雙關性,何為雙關?
(1).map[i][j]表示i到j的距離
(2).map[i][j]=0表示i到j不可以直接可達
要達到這種效果,首先將map[][]全部賦值為0,
然后存儲建圖,在建圖的過程中自然的將直接可達
的兩點賦值為不是0的值了。
2.一定要明白dis[]是干什么用的,是干什么用的呢?
dis[i]是用來存儲要求解的start點到i的最優解的。
一旦求出,將不會改動。當i=end的時候,也就是得到
答案的時候。
3.一定要明白visited[]是干什么用的,干什么用的?
當visited[i]=0,表示i點并沒有加入到已經解出的
集合中,也就是說,下次循環的時候是要訪問的對象。
當visited[i]=1,表示i點已經加入到了解出的集合
中,下次循環的時候,不能再次訪問它了。
好了,就這些了,多了沒有,不信你還是不懂!
View Code
#include "iostream" using namespace std; char name[201][500]; int map[201][201]; ////用來存儲圖,map[i][j]用來表示權值,也就是距離了——i到j的距離 int visited[201]; //用來表示某個頂點是否加入到頂點的集合 int dis[201]; //dis[i]用來表示距離——start點到i點的距離 int begin, end, sum; int Min(int a, int b) { return a>b?b:a; } int Str_Int(char name1[]) //將字符串轉化成一定的數字 { int i; for(i=0; i<sum; i++) if(strcmp(name1, name[i])==0) return i+1; strcpy(name[sum++], name1); return sum; } int Dijkstra(int n) { memset(visited, 0, sizeof(visited)); memset(dis, 0, sizeof(dis)); int now = begin, count = n-1, i; //count是個細節 visited[begin] = 1; dis[begin] = 999999; //這個十分的關鍵喲,不然下面的for循環無法工作 while(count--) { int k, maxdistance = 0; for(i=1; i<=n; i++) { if(!visited[i]) //沒有加入集合的話,就訪問它 { if(map[now][i]!=0) //兩點可以直接到達的話 if(dis[i] < Min( dis[now], map[now][i])) //dis[i]不可以比dis[now]更大,但是可以更小,所以用Min dis[i] = Min(,dis[now], map[now][i]); if(maxdistance < dis[i]) maxdistance = dis[k=i]; //k用來存儲距離now最短的頂點 } } if(k==end) break; visited[now=k] = 1; //將k放入集合中,并以k為下一個now,再次尋找下一個距離now最短的頂點 } return dis[end]; } int main() { int n, r, i, node1, node2, val; char name1[200], name2[200]; char st[200], en[200]; int k=0; while(cin>>n>>r && (n+r)) { k++; sum = 0; memset(name, 0, sizeof(name)); memset(map, 0, sizeof(map)); for(i=0; i<r; i++) { cin>>name1>>name2>>val; node1 = Str_Int(name1); node2 = Str_Int(name2); map[node1][node2]=map[node2][node1]=val; } cin>>st>>en; begin = Str_Int(st); end = Str_Int(en); cout<<"Scenario #"<<k<<endl<<Dijkstra(n)<<" tons"<<endl<<endl; } return 0; }
posted on 2011-10-03 22:21 More study needed. 閱讀(1213) 評論(2) 收藏 舉報

浙公網安備 33010602011771號