博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hdu 2680 Choose the best route
阅读量:4560 次
发布时间:2019-06-08

本文共 2278 字,大约阅读时间需要 7 分钟。

题意:求一个集合到另一个集合的最小路径。

思路1:直接用循环T次Dijkstra算法,从而求得最小值,但是TLE了。后来加一个添加一个新的源点,把起点与源点路径的赋值为0就可以啦。

条件:

(1)有向图。

(2)T次Dijkstra可能会超时。

 

CODE:

 

#include <stdio.h>
#include <stdlib.h>
#include <
string.h>
using 
namespace std;
const 
int SIZE = 
1010;
const 
int INF = 
0x3f3f3f3f;
int d[SIZE], v[SIZE];
int w[SIZE][SIZE];
int save[SIZE];
int n, m, s;
void Dijkstra(
int src)
{
    
int i, j;
    memset(v, 
0
sizeof(v));
    
for(i = 
0; i <= n; i++)    d[i] = (i == src)? 
0:INF;        
//
n+1个点 
    
for(i = 
0; i <= n; i++)
    {
        
int x, m = INF;
        
for(
int y = 
0; y <= n; y++) 
if(!v[y] && m > d[y]) m = d[x=y]; 
//
n+1个点 
        v[x] = 
1;
        
for(
int y = 
0; y <= n; y++) d[y] <?= d[x] + w[x][y];        
//
n+1个点 
    }
    
return ;
}
void init()
{
    memset(w, INF, 
sizeof(w));
    memset(d, 
0
sizeof(d));
    memset(v, 
0
sizeof(v));
    memset(save, 
0
sizeof(save));
}
int main()
{
    
while(~scanf(
"
%d%d%d
", &n, &m, &s))
    {
        init();
        
while(m--)
        {
            
int u, v, cost;
            scanf(
"
%d%d%d
", &u, &v, &cost);
            
if(cost < w[u][v])
                w[u][v] = cost;
        }
        
int T;
        scanf(
"
%d
", &T);
        
for(
int i = 
1 ; i <= T; i++) 
        {
            scanf(
"
%d
", &save[i]);
            w[
0][save[i]] = 
0;        
//
赋值为0 
        }
        Dijkstra(
0);
        
if(d[s] == INF) printf(
"
-1\n
");
        
else
        {
            printf(
"
%d\n
", d[s]);
        }
    }
    
return 
0;
}

 

思路2:建立反向图,将终点变为源点找最小值。

 

CODE:

 

#include <stdio.h>
#include <stdlib.h>
#include <
string.h>
using 
namespace std;
const 
int SIZE = 
1010;
const 
int INF = 
0x3f3f3f3f;
int d[SIZE], v[SIZE];
int w[SIZE][SIZE];
int save[SIZE];
int n, m, s;
void Dijkstra(
int src)
{
    
int i, j;
    memset(v, 
0
sizeof(v));
    
for(i = 
1; i <= n; i++)    d[i] = (i == src)? 
0:INF; 
    
for(i = 
1; i <= n; i++)
    {
        
int x, m = INF;
        
for(
int y = 
1; y <= n; y++) 
if(!v[y] && m > d[y]) m = d[x=y];  
        v[x] = 
1;
        
for(
int y = 
1; y <= n; y++) d[y] <?= d[x] + w[x][y];
    }
    
return ;
}
void init()
{
    memset(w, INF, 
sizeof(w));
    memset(d, 
0
sizeof(d));
    memset(v, 
0
sizeof(v));
    memset(save, 
0
sizeof(save));
}
int main()
{
    
while(~scanf(
"
%d%d%d
", &n, &m, &s))
    {
        init();
        
while(m--)
        {
            
int u, v, cost;
            scanf(
"
%d%d%d
", &u, &v, &cost);
            
if(cost < w[v][u])            
//
反向单向边 
                w[v][u] = cost;           
//
反向单向边 
        }
        
int T;
        scanf(
"
%d
", &T);
        
for(
int i = 
1 ; i <= T; i++)     scanf(
"
%d
", &save[i]);
        Dijkstra(s);
        
int m = INF;
        
for(
int i = 
1; i <= T; i++)    m <?= d[save[i]];
        
if(m == INF) printf(
"
-1\n
");
        
else
        {
            printf(
"
%d\n
", m);
        }
    }
    
return 
0;
}

 

转载于:https://www.cnblogs.com/g0feng/archive/2012/08/30/2664348.html

你可能感兴趣的文章
print2flash文档在线预览应用(java,.net)
查看>>
20145318 《网络对抗》 信息搜集与漏洞扫描
查看>>
java基础:十进制转换到任意进制
查看>>
关于PO自动生成AP发票
查看>>
Design Pattern----Creational.Pattern
查看>>
关于拖延症
查看>>
bit ( 比特 )和 Byte(字节)的关系 以及 网速怎么算
查看>>
QT学习:c++解析html相关
查看>>
Java -Dfile.encoding=UTF-8 干掉乱码
查看>>
[转]Jenkins HTML报告样式无法显示问题解决
查看>>
linux文件与目录管理(1)
查看>>
android学习记录(十三)Task 和 Activity 回退栈操作。
查看>>
EasyUI禁用控制方法常采用
查看>>
C++ 在dynamic_cast&lt;&gt;用法
查看>>
Solr使用入门指南
查看>>
Android 手机设置CMWAP 接入点
查看>>
3Sum Closest
查看>>
从此不再惧怕URI编码:JavaScript及C# URI编码详解(转)
查看>>
使用X-UA-Compatible来设置IE8兼容模式
查看>>
Python3.5-20190502-廖老师-自我笔记
查看>>