物語(最短路)

來源:互聯網
上載者:User

標籤:bubuko   pop   text   mono   idt   stream   eof   for   檢查   

 

 看完題目後就覺得 哈,好裸的最短路,寫Dijstra加優先隊列最佳化吧(本題會卡SPFA,SPFA當場去世)時是這樣的

分數君去世   

在此警告自己,數組範圍一定一定要想清楚後再寫,N和M不要弄混,要輸出“Inf”的情況一定要把特判條件寫清楚,範圍不要制定的那麼不清楚嘛(結果錯了)。

查錯時一定要再檢查幾遍數組範圍。

這麼裸的最短路不用再解釋了吧。把第m條邊的權值設為0,先跑一次最短路,屏蔽掉地m條邊跑出次長路的值,最後針對每一次最後一條邊的權值判斷要輸出誰就可以了。

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<queue> 6 #include<algorithm> 7  8 #define For(i,a,b) for(register int i=a;i<=b;++i) 9 #define Re register10 #define llg long long11 #define inf 0x7f7f7f12 #define Pn putchar(‘\n‘)13 using namespace std;14 const int N=2e5+10,M=5e5+10;15 int head[N],nxt[M*2],v[M*2],cnt=0;16 int n,m,k,x,y;17 llg w[M*2],Dis,cDis,z; //就是在這個地方的M寫成N了,爆掉了一半的分數。18 inline void read(int &v){19     v=0;20     char c=getchar();21     while(c<‘0‘||c>‘9‘)c=getchar();22     while(c>=‘0‘&&c<=‘9‘)v=v*10+c-‘0‘,c=getchar();23 }24 inline void read(llg &v){25     v=0;26     char c=getchar();27     while(c<‘0‘||c>‘9‘)c=getchar();28     while(c>=‘0‘&&c<=‘9‘)v=v*10+c-‘0‘,c=getchar();29 }30 void write(llg x){31     if(x>9)write(x/10);32     int xx=x%10;33     putchar(xx+‘0‘);34 }35 void add(int ux,int vx,llg wx){36     cnt++;37     nxt[cnt]=head[ux]; head[ux]=cnt; v[cnt]=vx; w[cnt]=wx;38     cnt++;39     nxt[cnt]=head[vx]; head[vx]=cnt; v[cnt]=ux; w[cnt]=wx;40 }41 42 struct Qr{43     llg x;44     int id;45     bool operator<(const Qr &a)const{46         return a.x<x;47     }48 };49 priority_queue<Qr>q;50 51 llg d[N],nf;52 void Djs(int chs){53     memset(d,inf,sizeof(d));54     nf=d[0];55     d[1]=0; q.push( (Qr) {0,1} );56     while(!q.empty()){57         Qr tp=q.top(); q.pop();58         if(d[tp.id]<tp.x)continue;59         for(Re int i=head[tp.id];i;i=nxt[i]){60             if(chs&&w[i]==0)continue;61             int vv=v[i];62             if(tp.x+w[i]<d[vv]){63                 d[vv]=tp.x+w[i];64                 q.push((Qr){d[vv],vv});65             }66         }67     }68 }69 70 int main(){71 //    freopen("monogatari.in","r",stdin);72 //    freopen("monogatari.out","w",stdout);73     read(n); read(m); read(k);74     For(i,1,m-1){75         read(x); read(y);read(z);76         add(x,y,z);77     }78     read(x); read(y); add(x,y,0);79     Djs(0); Dis=d[n];80     Djs(1); cDis=d[n];81     82     For(i,1,k){83         read(x);84         if(Dis>=nf){ //這個地方的>=忘記寫=號了。。85             printf("+Inf\n");86             continue;87         }88         if(Dis+x<cDis){89             write(Dis+x); Pn;90         }else{91             write(cDis); Pn;92         }93     }94     fclose(stdin); fclose(stdout);95     return 0;96 }

 

物語(最短路)

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.