| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
让第一个路径最短,再让第二个最短,不能保证两个加起来最短In Reply To:我用Dijkstra算法。自己做了好几个例子都对着,什么地方可能有错误? Posted by:bmexue at 2006-11-09 16:59:47 > 第一次的最短路经记录有问题? 代码如下:
>
> #include <iostream> //3068C
> using namespace std; //³ÌÐò¶ÔÁË µ«ÊÇËã·¨µÄЧÂÊÌ«µÍ£¬³ÌÐòÕûÌå½á¹¹¿´ÆðÀ´Ò²ºÜ²»ºÃ
>
> struct Edge
> {
> _int64 i,j,c;
> bool used;
> };
> Edge ed[10000];
> #define MAX 999999999
> _int64 e,M,N;
> _int64 cost[65][65];
> _int64 use[65][65]; //µÚÒ»´ÎÑ¡Ôñ×îÓÅÊÆÊ±i,jÔÚMÖÐËùÓõÄ
>
> _int64 dp[65];//, num_dp;
> bool final[65];
> _int64 L[65], rst;
>
> void load1() //ÓÉÓÚÿÖÖ·½·¨Ö»ÄÜÓÃÒ»´Î£¬ËùÒÔ´æÔÚÏûºÄ£¬ÐèÒªÁ½´Î¼Ç¼
> {
> for(_int64 i=0;i<N;i++){
> for(_int64 j=0;j<N;j++){
> use[i][j] = -1;
> }
> }
> for(i=0;i<M;i++){
> if( ed[i].c<cost[ed[i].i][ed[i].j]){
>
> cost[ed[i].i][ed[i].j] = ed[i].c;
> use[ed[i].i][ed[i].j] = i;
> }
> }
> for(i=0;i<N-1;i++){
> if( cost[0][0] < MAX )
> L[i] = 0;
> else
> L[i] = -1;
> }
> }
> void load2()
> {
> for(_int64 i=0;i<M;i++)
> if(!ed[i].used && ed[i].c<cost[ed[i].i][ed[i].j])
> cost[ed[i].i][ed[i].j] = ed[i].c;
>
> }
> void Diskstra()
> {
> _int64 i,j,p,min ;
> for(i=0;i<N;i++){
> final[i] = false; dp[i] = cost[0][i];
> }
> final[0] = true;
>
> for(i=1; i<N;i++){ //Ö÷Ñ­»·
> min = MAX; p=-1;
> for( j= 0 ; j<N;j++) { //ѰÕҴζÌ·¾¶, ÓÐÕÒ²»µ½µÄ¿ÉÄÜÐÔÄØ
> if(!final[j] )
> if( dp[j] < min) {p = j; min = dp[j];}
> }
> if(p==-1) //ûÕÒµ½£¬·µ»Ø×î¶Ì·¾¶
> {
> rst = MAX; return;
> }
> final[p] = true;
> if(p == N-1)
> break;
> for(j=0; j<N;j++) //¸úÐÂ
> if( !final[j] && (min+cost[p][j] < dp[j] ) ) {
> dp[j] = min+cost[p][j] ;
> L[j] = p; //¼Ç¼ÄÄÒ»¸ö¶¨µãË¢ÐÂÁË×Ô¼ºµÄ·¾¶³¤¶È
> }
> }
> rst +=dp[N-1];
> }
> void work(_int64 th)
> {
> rst =0;
> printf("Instance #%I64d: ",th);
> _int64 i,j;
> for(i=0;i<M;i++) //±ØÐë
> ed[i].used = false;
>
> for(i=0;i<N;i++){ //±ØÐë
> for(j=0;j<N;j++)
> cost[i][j] =MAX;
> cost[i][i] = 0;
> } load1();
>
> Diskstra();
> if(rst >=MAX) {printf("Not possible\n"); return;}
> i = N-1;
> while(true){
> ed[ use[L[i]][i] ].used =true;
> i = L[i];
> if(i==0)
> break;
> }
>
> for(i=0;i<N;i++){ //±ØÐë
> for(j=0;j<N;j++)
> cost[i][j] =MAX;
> cost[i][i] = 0;
> } load2();
>
> Diskstra();
> if(rst >=MAX) {printf("Not possible\n"); return;}
>
> printf("%I64d\n",rst);
> }
>
> _int64 main()
> {
> scanf("%d%d",&N,&M);
> _int64 p; _int64 th=1;
> while(N!=0 && M!=0){
> p=0;
> while(p<M){
> scanf("%d%d%d",&ed[p].i,&ed[p].j,&ed[p].c);
> p++;
> }
> work(th);
> th++;
> scanf("%d%d",&N,&M);
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator