POJ3411 Paid Roads 解题报告

来源:互联网 发布:中世纪2优化9经验 编辑:程序博客网 时间:2024/05/23 23:07


这题参考了他人的题解

这题是DFS ,因为路径有要求如果经过某个点,费用不一样,所以有可能多次经过同一点,数据是10条边,所以最多可以经过一个点5次(不是一些题解中说的3次)


如图,目标点是E,但是为了求最小费用,要经过F点5次,所以当一个点经过次数大于5次时,代表出现环,退出dfs


#include<cstdio>#include<cstring>#include<iostream>using namespace std;struct node{int x,y,c,d1,d2,next;}a[210];int len,first[210];int n,m , answer = 99999999;int v[210];void ins( int x,int y,int c,int d1,int d2 ){len++;a[len].x=x; a[len].y=y; a[len].c=c;a[len].d1=d1; a[len].d2=d2;a[len].next = first[x]; first[x] = len;}void find( int x,int pay ){if( x == n ){ answer = min( answer,pay ); return; }v[x] ++;if( v[x]<=5 )for( int k=first[x];k;k=a[k].next ){int y=a[k].y;if( v[ a[k].c ] ) find( y,pay+a[k].d1 );else find( y,pay+a[k].d2 );}v[x] --;}int main(){freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);memset( first,0,sizeof first ); len = 0;memset( v,0,sizeof v );int i,j,x,y,c,d1,d2;scanf("%d%d",&n,&m);for(i=1;i<=m;i++){scanf("%d%d%d%d%d",&x,&y,&c,&d1,&d2);ins( x,y,c,d1,d2 );}find( 1,0 );if( answer != 99999999 ) printf( "%d\n", answer );else printf( "impossible\n" );return 0;}


0 0
原创粉丝点击