| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
dfs + floyd + 剪枝,为何老WA??#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 105;
const int M = 101;
const int MAX = 1000000000;
struct edge
{
int u,v,l,w,next;
}e[N*N];
int first[N],t=-1;
void add(int u, int v, int l, int w)
{
t++;
e[t].u = u;
e[t].v = v;
e[t].l = l;
e[t].w = w;
e[t].next = first[u];
first[u] = t;
}
int n,k,r;
int min_cost[N][N];//the minist cost from every node to the destination
int min_road[N][N];//the minist path from every node to the destination
int best = MAX; //the shortest from the source to the destination
bool visit[N];
bool flag;
void floyd()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i==j)min_cost[i][j] = min_road[i][j] = 0;
else min_cost[i][j] = min_road[i][j] = MAX;
}
}
for(int u = 1; u <= n; u++)
{
for(int i = first[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
int w = e[i].w;
int l = e[i].l;
min_cost[u][v] = w;
min_road[u][v] = l;
}
}
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(min_cost[i][k]+min_cost[k][j] < min_cost[i][j])
{
min_cost[i][j] = min_cost[i][k]+min_cost[k][j];
}
if(min_road[i][j] > min_road[i][k]+min_road[k][j])
{
min_road[i][j] = min_road[i][k]+min_road[k][j];
}
}
}
}
}
void dfs(int u, int road, int cost)
{
if(cost+min_cost[u][n]>k || road+min_road[u][n]>=best)return;
if(u == n)
{
best = road;
flag = true;
}
else
{
for(int i = first[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
int w = e[i].w;
int l = e[i].l;
if(!visit[v] && cost + w <= k && road+l < best)
{
visit[v] = true;
dfs(v,road+l,cost+w);
visit[v] = false;
}
}
}
}
int main()
{
int u,v,w,l;
scanf("%d%d%d",&k,&n,&r);
memset(first,-1,sizeof(first));
t = -1;
while(r--)
{
scanf("%d%d%d%d",&u,&v,&l,&w);
add(u,v,l,w);
}
if(n==0)
{
printf("0\n");
return 0;
}
floyd();
flag = false;
memset(visit,false,sizeof(visit));
visit[1] = true;
best = MAX;
dfs(1,0,0);
if(flag)printf("%d\n",best);
else printf("-1\n");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator