uval 6425 Intercity

来源:互联网 发布:mac桌面下方图标删除 编辑:程序博客网 时间:2024/06/04 00:49

题意是说 我们有n(n<500000)个城市 原来是一个完全图,每一条边权为b,然后给你k条边 将边权替换为a

最后求1到n之间的最短路

比赛的时候想的1 n之间必然有边 所以不可能既走a边又走b边 所以将图分为a边和b边跑最短路

可有觉得复杂度的问题没有写

然而赛后才知道将完全图按邻接矩阵存 存完跑最短路也可以A

。。。


#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>using namespace std;struct Node{int n,v;};struct Node1{int num,next;}edge[1000101];int mark[500100],head[500100],cnt,mark1[500100];void add(int x,int y){edge[cnt].num=y;edge[cnt].next=head[x];head[x]=cnt++;edge[cnt].num=x;edge[cnt].next=head[y];head[y]=cnt++;}int n;long long dfs(int x,int d,int l){if(d==l+1) if(x==n) return 1;mark[x]=1;long long ret=0;for(int i=head[x];i!=-1;i=edge[i].next){int v=edge[i].num;if(!mark[v]) ret+=dfs(v,d+1,l);}mark[x]=0;return ret;}queue<Node> Q;int main(){int k,a,b,x,y;while(~scanf("%d%d%d%d",&n,&k,&a,&b)){cnt=0;memset(head,-1,sizeof(head));int flag=0;for(int i=0;i<k;i++){scanf("%d%d",&x,&y);if((x==1&&y==n)||(x==n&&y==1)) flag=1;add(x,y);}int ans=b;if(flag) ans=a;//queue<Node> Q;while(!Q.empty()) Q.pop();if(flag==0){Node p;p.n=1;p.v=1;Q.push(p);memset(mark,0,sizeof(mark));mark[1]=1;while(!Q.empty()){p=Q.front();Q.pop();if(p.v*a>=ans) break;for(int i=head[p.n];i!=-1;i=edge[i].next){int v=edge[i].num;if(!mark[v]){Node tmp;tmp.n=v;tmp.v=p.v+1;Q.push(tmp);mark[v]=tmp.v;}}if(mark[n]) {ans=min(ans,mark[n]*a-a);break;}}}else{memset(mark,0,sizeof(mark));memset(mark1,0,sizeof(mark));Node p;p.n=1;p.v=1;Q.push(p);mark[1]=1;while(!Q.empty()){p=Q.front();Q.pop();int q=p.n;if(p.v*b>=ans)  break;for(int i=head[q];i!=-1;i=edge[i].next){int v=edge[i].num;mark1[v]=q;}Node tmp;tmp.v=p.v+1;for(int i=1;i<=n;i++)if(!mark[i]&&mark1[i]!=q){tmp.n=i;Q.push(tmp);mark[i]=tmp.v;}if(mark[n]) {ans=min(ans,mark[n]*b-b);break;}}}cout << ans << endl;}}


0 0
原创粉丝点击