nyoj711&&zznu1624 最舒适的路线(第六届河南省程序设计大赛 广搜)

来源:互联网 发布:张予曦开的淘宝店 编辑:程序博客网 时间:2024/04/30 21:17

上次用了并查集的方法A了  这次用广搜试试~

难点就在于两个点之间可能有多条路线。

在这里我用了edge[x][y]数组标记x--y这条边出现的次数。每遍历一次就减一,成功ac

 #include <stdio.h>#include <vector>#include <math.h>#include <queue>#include <string.h>using namespace std;#define inf 0x3fffffffstruct node{int pos;//当前顶点 int pre;//和当前顶点相连的另外一个顶点 double val;double max; double min;double p;friend bool operator<(node a,node b){return a.p>b.p;}};vector<node>map[505];int S,T;int edge[505][505];int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);}void bfs(){priority_queue<node>s;node node1,node2;node1.pos=S;node1.max=-inf;node1.min=inf,node1.p=1,node1.pre=S;edge[S][S]++;s.push(node1);double MAX=-inf,MIN=inf,P=inf;int POS;while(!s.empty()){node1=s.top();s.pop();if(!edge[node1.pre][node1.pos]) continue;edge[node1.pre][node1.pos]--;edge[node1.pos][node1.pre]--;if(node1.pos==T) {POS=node1.pos;if(P>node1.p){MAX=max(MAX,node1.max);MIN=min(MIN,node1.min);P=node1.p;}}for(int i=0;i<map[node1.pos].size();i++){node temp=map[node1.pos][i];if(edge[node1.pos][temp.pos]){if(temp.val>node1.max) temp.max=temp.val;else temp.max=node1.max;if(temp.val<node1.min) temp.min=temp.val;else temp.min=node1.min;//printf("%d %d %lf %lf %lf\n",temp.pos,node1.pos,temp.max,temp.min,temp.val);temp.p=temp.max/temp.min;s.push(temp);}}}while(!s.empty()) s.pop();if(POS==T){if(P-floor(P)==0){printf("%.lf\n",P);}else{int x=(int)MAX;int y=(int)MIN;int r=gcd(x,y);printf("%d/%d\n",x/r,y/r);}}else{printf("IMPOSSIBLE\n");}}int main(){int k;//freopen("in.txt","r",stdin);scanf("%d",&k);while(k--){int n,m;memset(edge,0,sizeof(edge));memset(map,0,sizeof(map));scanf("%d %d",&n,&m);for(int i=0;i<m;i++){int x,y;node temp;double v;scanf("%d %d %lf",&x,&y,&v);temp.pos=x;temp.val=v;temp.pre=y;map[y].push_back(temp);temp.pos=y;temp.pre=x;map[x].push_back(temp);edge[x][y]++;edge[y][x]++;}scanf("%d %d",&S,&T);bfs();}return 0;}        



1 0
原创粉丝点击