poj 3662 Telephone Lines 图论
2013-04-14 19:40
363 查看
最短路径的变形
题目意思: 找一条连接1到n的路径,其中k条路径免费,剩下的边最大的就是花费,要求花费最小。
解法:ans[i][j]表示到达i顶点,使用了j条免费边的花费。然后就用spfa的那种思想来搞就行了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=10000+10;
struct node
{
intto,w,next,from;
}e[maxn<<1];
int head[maxn],lon;
void edgemake(int from,int to,int w)
{
e[++lon].to=to;
e[lon].from=from;
e[lon].w=w;
e[lon].next=head[from];
head[from]=lon;
}
int ans[1111][1111],text[1111][1111];
int quef[11111111],quet[11111111];
int spfa(int n,int m)
{
memset(ans,-1,sizeof(ans));
int front=1,end=0;
quef[++end]=1;
quet[++end]=0;
text[1][0]=1;
ans[1][0]=0;
while(front<=end)
{
int u=quef[front],t=quet[front++];
// printf("%d %d\n",u,t);
for(int k=head[u];k!=-1;k=e[k].next)
{
intv=e[k].to;
if(t<m)
{
if(ans[v][t+1]>ans[u][t]||ans[v][t+1]==-1)
{
ans[v][t+1]=ans[u][t];
if(text[v][t+1]==0)
{
text[v][t+1]=1;
quef[++end]=v;
quet[end]=t+1;
}
}
}
inttmp=max(ans[u][t],e[k].w);
if(ans[v][t]>tmp||ans[v][t]==-1)
{
ans[v][t]=tmp;
if(text[v][t]==0)
{
text[v][t]=1;
quef[++end]=v;
quet[end]=t;
}
}
}
text[u][t]=0;
}
int ret=111111111;
for(inti=0;i<=m;i++)
ret=min(ans
[i],ret);
return(ret);
}
int main()
{
int n,m,k;
scanf("%d %d%d",&n,&m,&k);
lon=0;
memset(head,-1,sizeof(head));
for(inti=1;i<=m;i++)
{
int from,to,w;
scanf("%d %d%d",&from,&to,&w);
edgemake(from,to,w);
edgemake(to,from,w);
}
intanswer=spfa(n,k);
printf("%d\n",answer);
return 0;
}
题目意思: 找一条连接1到n的路径,其中k条路径免费,剩下的边最大的就是花费,要求花费最小。
解法:ans[i][j]表示到达i顶点,使用了j条免费边的花费。然后就用spfa的那种思想来搞就行了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=10000+10;
struct node
{
intto,w,next,from;
}e[maxn<<1];
int head[maxn],lon;
void edgemake(int from,int to,int w)
{
e[++lon].to=to;
e[lon].from=from;
e[lon].w=w;
e[lon].next=head[from];
head[from]=lon;
}
int ans[1111][1111],text[1111][1111];
int quef[11111111],quet[11111111];
int spfa(int n,int m)
{
memset(ans,-1,sizeof(ans));
int front=1,end=0;
quef[++end]=1;
quet[++end]=0;
text[1][0]=1;
ans[1][0]=0;
while(front<=end)
{
int u=quef[front],t=quet[front++];
// printf("%d %d\n",u,t);
for(int k=head[u];k!=-1;k=e[k].next)
{
intv=e[k].to;
if(t<m)
{
if(ans[v][t+1]>ans[u][t]||ans[v][t+1]==-1)
{
ans[v][t+1]=ans[u][t];
if(text[v][t+1]==0)
{
text[v][t+1]=1;
quef[++end]=v;
quet[end]=t+1;
}
}
}
inttmp=max(ans[u][t],e[k].w);
if(ans[v][t]>tmp||ans[v][t]==-1)
{
ans[v][t]=tmp;
if(text[v][t]==0)
{
text[v][t]=1;
quef[++end]=v;
quet[end]=t;
}
}
}
text[u][t]=0;
}
int ret=111111111;
for(inti=0;i<=m;i++)
ret=min(ans
[i],ret);
return(ret);
}
int main()
{
int n,m,k;
scanf("%d %d%d",&n,&m,&k);
lon=0;
memset(head,-1,sizeof(head));
for(inti=1;i<=m;i++)
{
int from,to,w;
scanf("%d %d%d",&from,&to,&w);
edgemake(from,to,w);
edgemake(to,from,w);
}
intanswer=spfa(n,k);
printf("%d\n",answer);
return 0;
}
相关文章推荐
- POJ3662,洛谷1948 [USACO08JAN]电话线Telephone Lines
- POJ---3662(Telephone Lines,最短路+二分*好题)
- poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)
- POJ 3662 Telephone Lines(Dijkstra的邻接表存储)(可以作为模板题参考)
- POJ_3662_Telephone_Lines_(二分+最短路)
- [POJ][3662][Telephone Lines]
- POJ 3662: Telephone Lines
- Telephone Lines POJ - 3662(spfa+二分)
- POJ 3662 Telephone Lines 二分答案+djk
- POJ 3662 Telephone Lines 笔记
- POJ - 3662 Telephone Lines (二分 + 最短路)
- A - Telephone Lines POJ - 3662 第k+1条边尽量小
- Poj 3662 Telephone Lines【二分+SPFA】
- POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】
- 【POJ】3662 - Telephone Lines 二分+最短路
- POJ3662 Telephone Lines [二分 最短路]
- POJ 3662 Telephone Lines (二分+Dijkstra: 最小化第k大的值)
- POJ 3662 Telephone Lines(二分答案+SPFA)
- Divide and conquer:Telephone Lines(POJ 3662)
- POJ3662 Telephone Lines 二分+最短路