九度:题目1008:最短路径问题

2014-11-24 09:11:12 · 作者: · 浏览: 0

题目描述:
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:
9 11
分析:

乍一看像是dijkstra算法,但是还多了一个求最少花费的条件,所以不能找到目标点就返回,必须将所有能到目标点的情况都要遍历到,所以用SPFA算法

#include 
          
           
#include 
           
             #include 
            
              #include 
             
               #include 
              
                using namespace std; #define MAX 1002 #define INT 0x7fffffff int w[MAX]; int cost[MAX]; bool vis[MAX]; struct node{ int w,cost; }map[MAX][MAX]; int n,m,a,b,d,p,s,t; void SPFA(){ for(int i=1;i<=n;i++){w[i]=INT;cost[i]=INT;vis[i]=false;} queue
               
                 q; q.push(s); w[s]=0; cost[s]=0; vis[s]=true; while(!q.empty()){ int cur=q.front();q.pop(); vis[cur]=false; for(int i=1;i<=n;i++){ if(map[cur][i].w!=INT&&w[i]>=w[cur]+map[cur][i].w){ w[i]=w[cur]+map[cur][i].w; cost[i]=min(cost[i],cost[cur]+map[cur][i].cost); if(!vis[i]){ vis[i]=true; q.push(i); } } } } } int main(){ //freopen("C:\\in.txt","r",stdin); while(~scanf("%d%d",&n,&m)){ if(!n&&!m)break; for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){map[i][j].w=INT;map[i][j].cost=INT;} for(int i=1;i<=m;i++){ scanf("%d%d%d%d",&a,&b,&d,&p); map[a][b].w=map[b][a].w=d; map[a][b].cost=map[b][a].cost=p; } scanf("%d%d",&s,&t); SPFA(); printf("%d %d\n",w[t],cost[t]); } return 0; } /************************************************************** Problem: 1008 User: starcuan Language: C++ Result: Accepted Time:10 ms Memory:9376 kb ****************************************************************/
               
              
             
            
           
          




<script type="text/java script">
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
上一篇: BZOJ 1588 [HNOI2002]营业额统计
下一篇: UVA - 11991 Easy Problem from Rujia Liu
相关文章
由一道题目想到的C++编译器优化问题
<script type="text/java script">BAIDU_CLB_fillSlot("182716");
<script type="text/java script">BAIDU_CLB_fillSlot("517916");
图文推荐
<iframe src="http://www.2cto.com/uapi.php tid=278961&catid=339&title=vsW2yKO6zOLEvzEwMDijutfutszCt762zsrM4g==&forward=http://www.2cto.com/kf/201402/278961.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
<script type="text/java script">BAIDU_CLB_fillSlot("771057");