poj2263-没有在比赛中a掉的水题

来源:互联网 发布:如何用ps制作淘宝主图 编辑:程序博客网 时间:2024/04/27 23:45

这题一开始看,就感觉有线段树的影子,可是还是没有思路去实现,根本不是一种数据结构。或许是我现在只懂基础,等以后理解加深后看有没有想法。我用dijkstra来a掉的;

它和普通的dij题不同:

一:主要在更新上,有一个min(从i到x,再由到y这条路上的最大载货量),

                                                max(比较从i到x再到y和从i直接到y中最大距离);

二:用来标记的值也有不同,不是inf,而是-1;

三:我开始从0开始,结果有误,之后改为从1开始,就ok了,原因查了半天也没查出(如果知道,谢谢告知);

(记:这是我第一次没用c++来做c的事情,初步会用map)

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<map>#include<string>using namespace std;const int INF=1e9;int vis[205];int dis[205];int g[205][205];int text;void dijkstra(int from,int to,int n){    for(int i=1;i<=n;i++){        if(g[from][i]>0)            dis[i]=g[from][i];        else dis[i]=-1;    }    vis[from]=1;    dis[from]=0;    for(int i=1;i<=n;i++){        int x, MIN=INF;        for(int y=1;y<=n;y++){            if(!vis[y]&&dis[y]<MIN&&dis[y]>0){                MIN=dis[x=y];            }        }        vis[x]=1;        for(int y=1;y<=n;y++){            if(g[x][y]>0){                int t=min(dis[x],g[x][y]);//从i到x,再由到y这条路上的最大载货量                dis[y]=max(dis[y],t);       //比较从i到x再到y和从i直接到y中最大距离;            }        }    }    cout<<"Scenario #"<<text<<endl;    cout<<dis[to]<<" tons"<<endl<<endl;}void init(int n){    int i,j;    for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            if(i!=j)            {                g[i][j]=-1;            }}int main(){    int n,m;    freopen("int.txt","r",stdin);    string from,to;    int w;    text=0;    while(~scanf("%d%d",&n,&m)&&n&&m){        text++;        memset(dis,0,sizeof(dis));        memset(g,0,sizeof(g));        memset(vis,0,sizeof(vis));        init(n);        map<string,int>mp;        int  cnt=0,a,b;        while(m--){            cin>>from>>to>>w;            a=mp[from];            b=mp[to];            if(!a){                a=++cnt;                mp[from]=a;            }            if(!b){                b=++cnt;                mp[to]=b;            }            if(g[a][b]<w)                g[a][b]=g[b][a]=w;        }        cin>>from>>to;        int sta=mp[from];        int fin=mp[to];        dijkstra(sta,fin,n);    }    return 0;}



0 0
原创粉丝点击