个人网站怎么做引流,水网站模板,深圳装修公司排行榜,东莞seo建站推广题目大意#xff1a;给出一个图#xff0c;顶点为1到n和一个值k#xff0c;求出包含顶点1到顶点n的通路的子图中#xff0c;第k1大的边最短为多少#xff1f;#xff08;若存在一条从1到n路径边数小于等于k#xff0c;则返回0#xff0c;若不存在通路#xff0c;返回-… 题目大意给出一个图顶点为1到n和一个值k求出包含顶点1到顶点n的通路的子图中第k1大的边最短为多少若存在一条从1到n路径边数小于等于k则返回0若不存在通路返回-1 思路一开始我连题都看错了还以为是动规汗··· 很显然此题不好从正面下手即如果从找到路径下手的话会变得相当棘手于是想到枚举边以某一边作为子图中第k1大的边看是否是可行解比它大的边的权值为1反之为0用spfa算出1到n的最短路若路径长大于k则二分查找比m更大的边反之则查找更小的边并可用e[0]0表示权值为零的边即路径上边数小于k这样就不难得出正确解了。算法时间为O(nlgn)。 代码如下 #include iostream
#include fstream
using namespace std;
ifstream fin(phone.in);
ofstream fout(phone.out);
int graph[1001][1001],matrix[1001][1001];
bool status[10001];
typedef struct
{
int start,end;
int w;
}Bian;
Bian bian[10001];
int d[1001];
int Q[10001];
int partion(Bian *a,int start,int end)
{
int jstart-1;
Bian t;
for(int istart;iend;i)
{
if(a[i].wa[end].w)
{
j;
ta[i];
a[i]a[j];
a[j]t;
}
}
return j;
}
int quicksort(Bian *a,int start,int end)
{
if(startend)
return 0;
int jpartion(a,start,end);
quicksort(a,start,j-1);
quicksort(a,j1,end);
return 0;
}
int initial(int n)
{
for(int i0;in;i)
d[i]10000000;
return 0;
}
int spfa(Bian *m,int n)
{
initial(n);
d[1]0;
int head1,tail1,t0,i0,x0;
Q[1]1;
while(((tail1)000)!head)
{
tQ[head];
head;
head%10000;
for(i1;igraph[t][0];i)
{
x0;
if(matrix[t][graph[t][i]]m-w)
x1;
if(d[graph[t][i]]d[t]x)
{
d[graph[t][i]]d[t]x;
tail;
Q[tail]graph[t][i];
tail%10000;
}
}
}
return d[n];
}
int bins(int n,int p,int start,int end,int k)
{
if((end0||startp)||(startend))
return -1;
int m(startend)/2;
if(spfa(bian[m],n)k)
return bins(n,p,m1,end,k);
else
{
int tbins(n,p,start,m-1,k);
if(t-1)
return m;
return t;
}
}
int main()
{
ios::sync_with_stdio(0);
int N0,P0,K0,i0,x0,y0,z0;
finNPK;
for(i1;iP;i)
{
finxyz;
graph[x][0];
graph[x][graph[x][0]]y;
graph[y][0];
graph[y][graph[y][0]]x;
matrix[x][y]z;
matrix[y][x]z;
bian[i].startx;
bian[i].endy;
bian[i].wz;
}
quicksort(bian,1,P);
ibins(N,P,0,P,K);
if(i0)
fout-1endl;
else
foutbian[i].wendl;
return 0;
} 这道题说明将适当的对象作为枚举对象是重要的思想方法。转载于:https://www.cnblogs.com/kliner/archive/2012/10/12/noi2008_2_phone.html