NOIP2012 模拟试题二 腾讯大战360
生活随笔
收集整理的這篇文章主要介紹了
NOIP2012 模拟试题二 腾讯大战360
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:
NOIP2012 模擬試題二 騰訊大戰(zhàn)360
題意:
馬化騰和周鴻祎吃飽了撐了!他們兩個(gè)又想搞事情。沒事就要干架,但腦子又不好使兒,只能拜托我們求出怎么才能使他們要走的距離最短。
分析:
這題明顯是最短路的題目,用Floyd鐵定ACTLE。最理想的方法肯定是spfa算法,但因?yàn)閿?shù)據(jù)夠水小編人品好,所以dij也是可以的。
AC后感想:
前30分鐘,一直錯(cuò)得迷迷糊糊,后來才發(fā)現(xiàn),他們兩位大佬可以一起走,所以要dij兩次。改正后,AC了!
小編絕對(duì)不會(huì)告訴你們這道題直接輸出:"Peace!"可以對(duì)6個(gè)點(diǎn)!
代碼:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define LL long long using namespace std; inline LL read() {LL a=0,f=1;char s=getchar();while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}while(s>='0'&&s<='9') {a=a*10+s-'0';s=getchar();}return a*f; } int maxd,t[5001][5001],p[5001],p1[5001],z[5001],ans1,ans2,mina; int min(int x,int y) {return x>y? y:x; } int max(int x,int y) {return x>y? x:y; } int main() {int n,m,a,b;n=read();m=read();for(int i=1;i<=5000;i++)//初始化{for(int j=1;j<=5000;j++)t[i][j]=117901065;t[i][i]=0;}for(int i=1;i<=m;i++){a=read();b=read();t[a][b]=t[b][a]=read();//雙向邊maxd=max(max(a,b),maxd);//求出最大的點(diǎn)數(shù)}a=read();b=read();//dij初始化for(int i=1;i<=maxd;i++) p[i]=t[a][i];z[a]=1;int l;for(int i=1;i<=maxd-1;i++)//第一次dij{l=117901065;int k=0;for(int j=1;j<=maxd;j++)if(z[j]==0&&p[j]<l) l=p[j],k=j;if(k==0) break;z[k]=1;for(int j=1;j<=maxd;j++)p[j]=min(p[j],p[k]+t[k][j]);}//dij初始化for(int i=1;i<=maxd;i++) p1[i]=t[b][i];for(int i=1;i<=maxd;i++) z[i]=0;z[b]=1;for(int i=1;i<=maxd-1;i++)//第二次{l=117901065;int k=0;for(int j=1;j<=maxd;j++)if(z[j]==0&&p1[j]<l) l=p1[j],k=j;if(k==0) break;z[k]=1;for(int j=1;j<=maxd;j++)p1[j]=min(p1[j],p1[k]+t[k][j]);}mina=117901065;for(int i=1;i<=maxd;i++)//枚舉兩次dij所求出的值的和{ans1=p[i];ans2=p1[i];mina=min(max(ans1,ans2),mina);//求這兩者間耗時(shí)最長的那一個(gè),與其他中最短的}if(mina!=117901065) printf("%d",mina);//如果可以相遇else printf("Peace!");fclose(stdin);fclose(stdout);return 0; }總結(jié)
以上是生活随笔為你收集整理的NOIP2012 模拟试题二 腾讯大战360的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache poi 实现将PPT(20
- 下一篇: MySQL事件的创建和执行