读书人

hdu 4318 Power transmission 临接表

发布时间: 2012-08-22 09:50:35 作者: rapoo

hdu 4318 Power transmission 临接表 广搜 多校联合赛(二) 第九题

现学的临近表

广搜的过程中不断更新点剩余电量的最大值

本来想找我的参考blog的,怎么搜不到了呢!那就不好意思啦

#include<iostream>#include<cstdio>#include<queue>using namespace std;#define N 50005#define inf 0.0struct edge{    int t;    int w;    edge *next;}*lisk[N];int vis[N];double pa[N];void add(int u,int t,int w){    edge *tmp=new edge;    tmp->t=t;    tmp->w=w;    tmp->next=lisk[u];    lisk[u]=tmp;}void bfs(int i,int y){    queue<int > q;    q.push(i);    while(!q.empty()){        int p=q.front();q.pop();        double sum=pa[p];        edge *tmp=lisk[p];        while(tmp!=NULL){            double cost=sum*(100-tmp->w)/100.0; //           cout<<p<<" "<<tmp->t<<" "<<cost<<endl;            if(pa[tmp->t]<cost){                q.push(tmp->t);                pa[tmp->t]=cost;            }            tmp=tmp->next;        }    }}int main(){    int n,t,s,m;    cout<<inf<<endl;    scanf("%d",&n);    for(int i=0;i<=n;i++)        lisk[i]=NULL;    for(int i=1;i<=n;i++){        pa[i]=inf;        vis[i]=0;        scanf("%d",&m);        while(m--){ //           cout<<t<<endl;            scanf("%d%d",&t,&s);            add(i,t,s);        }    }//    edge *tmp=lisk[1];//    while(tmp!=NULL){//        cout<<tmp->t<<" ";//        tmp=tmp->next;//    }//    cout<<endl;//    cout<<n<<endl;    int x,y;    double sum;    scanf("%d%d%lf",&x,&y,&sum);    pa[x]=sum;    vis[x]=1;    bfs(x,y);    if(pa[y]==inf) printf("IMPOSSIBLE!\n");    else printf("%.2lf\n",sum-pa[y]);    return 0;}


读书人网 >编程

热点推荐