10.26

来源:互联网 发布:gl850g数据手册 编辑:程序博客网 时间:2024/05/29 12:39

抄代码

应仔细审题,一份代码只有一行但是是由小写字母,数字,空格和分号组成,并非样例的输入格式。

做运动

按温度从小到大排序加入图中,用并查集维护,当s和t联通时,跑一遍最短路。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<ctime>#include<algorithm>#include<queue>using namespace std;struct pp{int x,y,t;long long c;}a[1000005];struct node{int next,to;long long w;}edge[2000005];bool comp(const pp &a,const pp &b){return a.t<b.t;}long long dis[500005];int fa[500005],first[500005];int n,m,s,t,ans,tot=0,pos;priority_queue<pair<long long,int> >q;inline int read(){int sum=0,f=1;char ch;for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());if(ch=='-'){f=-1;ch=getchar();}for(;isdigit(ch);ch=getchar())sum=(sum<<3)+(sum<<1)+ch-48;return sum*f;}int get(int v){if(v==fa[v])return v;fa[v]=get(fa[v]);return fa[v];}void add(int x,int y,long long z){edge[++tot].next=first[x];first[x]=tot;edge[tot].to=y;edge[tot].w=z;}void dij(){for(register int i=1;i<=n;i++)dis[i]=5e17;dis[s]=0;q.push(make_pair(0,s));while(!q.empty()){int u=q.top().second;if(u==t) break;q.pop();for(register int i=first[u];i;i=edge[i].next){if(dis[edge[i].to]>dis[u]+edge[i].w){dis[edge[i].to]=dis[u]+edge[i].w;q.push(make_pair(-dis[edge[i].to],edge[i].to));}}}}int main(){//freopen("k.in","r",stdin);//freopen("k.out","w",stdout);n=read();m=read();for(register int i=1;i<=n;i++)fa[i]=i;for(register int i=1;i<=m;i++){a[i].x=read();a[i].y=read();a[i].t=read();a[i].c=read();}s=read();t=read();sort(a+1,a+m+1,comp);for(register int i=1;i<=m;i++){int fx=get(a[i].x);int fy=get(a[i].y);add(a[i].x,a[i].y,(long long)a[i].t*a[i].c);add(a[i].y,a[i].x,(long long)a[i].t*a[i].c);if(fx!=fy){fa[fx]=fy;}if(get(s)==get(t)){pos=i;ans=a[i].t;break;}}while(a[++pos].t==ans){add(a[pos].x,a[pos].y,(long long)a[pos].c*a[pos].t);add(a[pos].y,a[pos].x,(long long)a[pos].c*a[pos].t);}dij();std::cout<<ans<<" "<<dis[t];return 0;}

原创粉丝点击